#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”替换为整数值而不是字符串?
最佳答案
ISO C 标准将翻译过程定义为由不同的阶段组成,按照(例如)C11 5.1.1.2
。在该部分中,预处理器在第 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/