gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:03:38 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com