c - C-如何在宏中分配值?

标签 c x-macros

我正在尝试在我的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/

相关文章:

c++ - stdio.h对应的库文件是动态链接的还是静态链接的

javascript - 从左到右计算googolplex二进制

c - X-Macros 的实际使用

c++ - 在变量宏扩展中我的逗号在哪里消失?

c++ - 是否可以将 X-Macro 与 std::variant (或一般模板)一起使用?

c - 如何在没有 x-macros 的情况下在 C 中获得类似反射的功能

c - 如何使用 -D 选项将参数中的字符串化宏传递给 gcc

c - 从单向链表中删除节点 C

c - 重新排序连续跨步像素阵列的最有效方法是什么?

c++ - 使用 C++ 将 XMacro 结构打印到控制台