gpt4 book ai didi

能否在串联 ## 宏中替换整数变量?

转载 作者:太空宇宙 更新时间:2023-11-04 02:26:50 24 4
gpt4 key购买 nike

#define BRICK_HOLLOW(I) brick_ ## I ## _hollow
#define BRICK_SOLID(I) brick_ ## I ## _solid


struct wall {
int brick_0_hollow;
int brick_0_solid;
int brick_1_hollow;
int brick_1_solid;
}mywall;


for (int i = 0; i < 2; i++)
{
mywall.BRICK_HOLLOW(i) = 20;
mywall.BRICK_SOLID(i) = 10;
}

预期输出:

上面的for循环必须展开为

mywall.brick_0_hollow = 20
mywall.brick_0_solid = 10
mywall.brick_1_hollow = 20
mywall.brick_1_solid = 10

但代码只是将 int 替换为字符串。所以我得到

mywall.brick_i_hollow = 20

未在结构声明中定义并抛出编译错误。有没有办法用整数值代替变量“int i”而不是使用双重间接寻址的字符串?

最佳答案

根据(例如)C11 5.1.1.2,ISO C 标准将翻译过程定义为由不同的阶段组成。在该部分中,预处理器在第 4 阶段完成,句法/语义分析直到第 7 阶段才开始。

这意味着您的宏扩展对 C 标记(a) 及其引用的对象的了解。它特别是不知道这些变量将具有什么,因为预处理是编译时事件,而变量的分配和评估发生在运行时。


在这种特殊情况下,您最好拥有一个可以在运行时对其进行索引的数组,例如:

struct wall {
int brick_hollow[2];
int brick_solid[2];
} mywall;

for (int i = 0; i < 2; i++)
{
mywall.brick_hollow[i] = 20;
mywall.brick_solid[i] = 10;
}

(a) 它理解预处理 标记,但它们是不同的野兽。

关于能否在串联 ## 宏中替换整数变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49899861/

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