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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我可以在c结构声明中使用宏吗?相关的知识,希望对你有一定的参考价值。

我有

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不存在。我很确定这是因为预处理器处理宏的方式。有人有更好的建议吗?

我不想动态分配结构。

答案

但我得到一个编译器错误抱怨_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;
}

以上是关于我可以在c结构声明中使用宏吗?的主要内容,如果未能解决你的问题,请参考以下文章

我可以使用 Access VBA 来确定表是不是有数据宏吗?

我可以附加到预处理器宏吗?

我可以在 Visual Studio 2012/2013/2015/2017/2019 中录制/播放宏吗?

可以在运行/调试配置中使用 CLion 宏吗?

inline内联函数

pyvot:我可以从 python 脚本运行 Excel VBA 宏吗?