宏的参数与结构域混合

Mic*_*hał 1 c macros

所以我有这样的宏:

#define some_macro(param1)    \
static some_struct_t struct = \
{                             \
    .param1 = param1          \
}
Run Code Online (Sandbox Code Playgroud)

当我从main调用此宏时具有直接值:

some_macro(50);
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

..\..\main.c(185): error:  #29: expected an expression
Run Code Online (Sandbox Code Playgroud)

我找到了两种方法来解决它,第一种是在main中声明const值并传递给宏,第二种是更改参数的名称与宏中的相同.

所以它有效,但我没有造成错误.有任何想法吗?

Dav*_*eri 5

struct 是保留字,不能将其用作变量名

改为:

#define some_macro(p1)                \
static some_struct_t valid_var_name = \
{                                     \
    .param1 = p1                      \
}
Run Code Online (Sandbox Code Playgroud)

如果你想使用member(param1)的相同名称作为宏参数的名称,你需要停止扩展(使用##)或者你得到.50 = 50

#define some_macro(param1)     \
static some_struct_t varname = \
{                              \
    .param##1 = param1         \
}
Run Code Online (Sandbox Code Playgroud)