我正在尝试在我的x宏中分配一个值,但我真的不明白为什么它不起作用:
#include <stdio.h>
typedef struct
{
int a;
int b;
} struct_t;
#define MY_LIST \
MY_ELEMENT(a) \
MY_ELEMENT(b)
#define MY_ELEMENT(x) struct_t x; \
x.a=33;
MY_LIST
#undef MY_ELEMENT
int main(void)
{
fprintf(stdout, "a: %d\n", a.a);
return 0;
}
编译时,出现以下错误:
test.c:14:2: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘.’ token
x.a=33;
有人可以解释为什么我得到这个错误以及如何解决这个问题吗?
最佳答案
您需要在源文件slethoprod.c
中查看代码的预处理形式。使用GCC,您可以使用gcc -C -E slethoprod.c > slethoprod.i
来获取它,然后(使用编辑器或寻呼机)检查该slethoprod.i
文件。
它包含以下内容:
struct_t a; a.a = 33; struct_t b; b.a = 33;
显然不是有效的C代码(因为它在scope文件中的任何函数之外都有一些赋值;请记住initialization中的declaration不是assignment)。
您可能希望具有一些定义(带有初始化),例如
struct_t a = {33};
甚至(为了便于阅读)像struct initialization
struct_t b = {.a=33};
您可以玩preprocessor技巧来达到目的。
查看一些C reference网站和/或研究C11标准n1570以了解有关C的更多信息。另请阅读编译器(例如GCC)和预处理器(例如cpp)的文档。
顺便说一句,我个人觉得使用与字段中的某个字段相同的名称
a
命名全局变量的味道不佳(即使合法,因为字段名称和全局变量具有不同的namespaces)。出于可读性考虑,我建议避免这种情况。
关于c - C-如何在宏中分配值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54157806/