gpt4 book ai didi

c++ - 为什么在宏扩展之前完成 token 替换?

转载 作者:行者123 更新时间:2023-12-03 23:00:23 25 4
gpt4 key购买 nike

考虑以下片段:

#include <stdio.h>

#define MY_MACRO(\
arg) \
arg

#define MY_MACRO2(t1, t2) t1##t2

#define MY_ a

#define MACRO b

int main() {
printf("%d\n", MY_MACRO2(MY_,MACRO)(45));
return 0;
}
事实证明编译并显示 45,但是,如果 MY_MACRO在替换之前扩展,此代码不应编译。
我注意到这一点的原因是当我在 C 标准中阅读以下内容时:
6.10.3.1(也在 C++ 标准中)
在确定调用类函数宏的参数后,将发生参数替换。替换列表中的参数,除非前面有 # 或 ## 预处理标记或后跟 ## 预处理标记(见下文) , 替换为相应的参数 在其中包含的所有宏都被扩展后 .在被替换之前,每个参数的预处理标记被完全宏替换,就好像它们形成了预处理文件的其余部分一样;没有其他预处理 token 可用
所以如果所有包含在参数中的宏在替换之前都被扩展了,为什么我们不以 ab(45) 结束? ?

最佳答案

让建筑如 X(X())工作。请注意,虽然 X()扩展了 X宏被禁用以避免无限递归。在扩展宏之前扩展参数让我们在参数中使用 X。X(X())的实际应用:

#define TEN(x) x x x x x x x x x x
#define HUNDRED(x) TEN(TEN(x))

关于c++ - 为什么在宏扩展之前完成 token 替换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66354699/

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