可以在串联##宏中替换整数变量吗?

时间:2018-04-18 12:34:50

标签: c for-loop macros int concatenation

#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

未在struct声明中定义并抛出编译错误。 有没有办法替换变量&#34; int i&#34;使用double间接使用整数值而不是字符串?

1 个答案:

答案 0 :(得分:2)

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)它理解预处理令牌,但它们是不同的野兽。