我可以在c struct声明中使用宏吗?

时间:2018-08-30 20:18:22

标签: c struct macros

我有

struct foo {
    int var;
}

和foo的静态声明

static const struct foo bar =  {
     .var = 8;
};

我想做的是

#define sizeit(_struct) .var = sizeof(struct _struct)

我可以做

static const struct foo bar = {
     sizeit(foo)
};

但是我收到一个编译器错误,抱怨_struct不存在。我很确定这是因为预处理器处理宏的方式。有谁有更好的建议?

我不想动态分配结构。

1 个答案:

答案 0 :(得分:1)

  

但是我收到一个编译器错误,抱怨_struct不存在

我已经编译了您的代码。它可以在我的系统上毫无问题地进行编译。您不应使用下划线开头的变量名,因为它们是保留的。最好张贴完整的编译器消息。

struct foo {
    int var;
};

#define sizeit(x) .var = sizeof(struct x)


static const struct foo bar = {
     .var = 8
};

static const struct foo bar2 = {
     sizeit(foo)
};

int main()
{

    return 0;
}

要获取preprocessed源代码,我们可以将gcc-E选项一起使用。预处理后的输出如下:

# 1 "stack_macro2.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "stack_macro2.c"
struct foo {
 int var;
};




static const struct foo bar = {
  .var = 8
};

static const struct foo bar2 = {
  .var = sizeof(struct foo)
};

int main()
{

return 0;
}