gpt4 book ai didi

c - 为什么在 C 预处理器宏中嵌套扩展与串联失败?

转载 作者:行者123 更新时间:2023-12-04 09:25:50 25 4
gpt4 key购买 nike

我目前正在自动创建具有几乎相同内容的多个功能。
这是这个项目的最小样本:

#include <stdio.h>

#define _macro_print(m) printf("Value: %x\n", test_##m);
#define _macro_var_def(m) int test_##m = m;

// Repeat macro d n-times
#define BSV_REPEAT(n, d) _BSV_REPEAT_##n(d)
#define _BSV_REPEAT_1(d) _macro_##d(0)
#define _BSV_REPEAT_2(d) _BSV_REPEAT_1(d)_macro_##d(1)
#define _BSV_REPEAT_3(d) _BSV_REPEAT_2(d)_macro_##d(2)
#define _BSV_REPEAT_4(d) _BSV_REPEAT_3(d)_macro_##d(3)

#define NUMBER_OF_TIMES 4

int main() {
BSV_REPEAT(4, var_def)
// NUMBER_OF_TIMES
BSV_REPEAT(4, print)
//BSV_REPEAT(NUMBER_OF_TIMES, print)
return 0;
}
_macro_print 背后的实际宏要复杂得多,因此不可能在运行时使用 for 循环或类似的东西来完成它。
在实际项目中,我多次使用 BSV_REPEAT 宏和不同的宏,但重复次数始终相同。当然,我想为这个数字创建一个定义,以便我以后可以轻松地更改它。
当我使用定义 NUMBER_OF_TIMES CLion 报告以下 message并且程序不能再 compiled.
我现在的问题是如何解决这个问题?有没有办法强制提前评估 NUMBER_OF_TIMES?

最佳答案

您需要控制扩展顺序。
为此,引入了一个专门的扩展和连接层:

#define _macro_print(m) printf("Value: %x\n", test_##m);
#define _macro_var_def(m) int test_##m = m;

#define CONCAT(x,y) x##y
// Repeat macro d n-times
#define BSV_REPEAT(n, d) CONCAT(_BSV_REPEAT_,n)(d)
#define _BSV_REPEAT_1(d) CONCAT(_macro_,d)(0)
#define _BSV_REPEAT_2(d) _BSV_REPEAT_1(d)CONCAT(_macro_,d)(1)
#define _BSV_REPEAT_3(d) _BSV_REPEAT_2(d)CONCAT(_macro_,d)(2)
#define _BSV_REPEAT_4(d) _BSV_REPEAT_3(d)CONCAT(_macro_,d)(3)

#define NUMBER_OF_TIMES 4

int main() {
BSV_REPEAT(4, var_def)
NUMBER_OF_TIMES
BSV_REPEAT(4, print)
BSV_REPEAT(NUMBER_OF_TIMES, print)
return 0;
}
以上输出 -E选项:
int main() {
int test_0 = 0;int test_1 = 1;int test_2 = 2;int test_3 = 3;
4
printf("Value: %x\n", test_0);printf("Value: %x\n", test_1);printf("Value: %x\n", test_2);printf("Value: %x\n", test_3);
printf("Value: %x\n", test_0);printf("Value: %x\n", test_1);printf("Value: %x\n", test_2);printf("Value: %x\n", test_3);
return 0;
}
并且请改掉使用以“_”开头的标识符的习惯,它们是保留的。

关于c - 为什么在 C 预处理器宏中嵌套扩展与串联失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63011763/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com