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

标签 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

它未在结构声明中定义并引发编译错误。 有没有办法使用双间接寻址将变量“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/

相关文章:

c - APUE :how to print something alternately in two process?

C 人生游戏问题

c++ - 结合 CMake option() 与 add_definitions()

c - 当我们可以执行 char *string = "variables whose values are an address"时,指针 "string"怎么样?

字符到二进制函数不能按预期工作

java - 在 Java 中生成以不同数字开头的数字模式

python - 如何从多个矩阵列表中创建矩阵?

javascript - Javascript 中使用 if/else 嵌套 for 循环

macros - 为什么我们修改它时需要重新编译使用Common Lisp宏的定义?

c - 如何使用宏来调用函数?