【问题标题】:Can an integer variable be substituted in a concatenation ## macro?可以在串联## 宏中替换整数变量吗?
【发布时间】:2023-04-01 11:29:01
【问题描述】:
#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”而不是使用双重间接的字符串?

【问题讨论】:

  • 你可能想在你的标签中指定你正在编码的语言。所以这个问题也会出现在这个类别中。
  • 否;预处理器在主编译之前运行,因此它产生的字符串是在编译器正确查看代码之前决定的。

标签: c for-loop macros int concatenation


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-13
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    • 2012-05-14
    • 2023-03-04
    相关资源
    最近更新 更多