#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间接使用整数值而不是字符串?
答案 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)它理解预处理令牌,但它们是不同的野兽。