奇怪的c++预处理器行为
Weird c++ pre processor behaviour
考虑以下代码:
#define M(x) #x
#define M2(x) M(x)
M(VAR);
M2(VAR);
使用以下命令行:cpp test.cpp -DVAR=xxx
我希望预处理器同时改变M(x)和M2(x)进入"xxx"。
但只有M2被替换。为什么呢?
当我尝试这个时,我得到:
"VAR";
"abc";
(你应该把它包括在你的问题里!)
本页解释
如果要对宏参数展开的结果进行字符串化,你必须使用两个级别的宏。
#define xstr(s) str(s)
#define str(s) #s
#define foo 4
str (foo)
==> "foo"
xstr (foo)
==> xstr (4)
==> str (4)
==> "4"
s在str中使用时会被字符串化,因此不会进行宏展开第一。但是s是xstr的一个普通参数,所以它完全是在XSTR本身展开之前进行宏展开。因此,随着时间的推移当STR到达它的实参时,它已经被宏展开了。
这是因为预处理器对预扫描宏参数的规则,如下所示:
那一页的重点是:
调用其他用于字符串化或连接的宏的宏。
如果参数被字符串化或连接,则预扫描不会发生。如果要展开宏,请进行字符串化或连接它的展开,可以通过让一个宏调用另一个宏来实现执行字符串化或连接的宏。例如,如果你有
#define AFTERX(x) X_ ## x #define XAFTERX(x) AFTERX(x) #define TABLESIZE 1024 #define BUFSIZE TABLESIZE
AFTERX(BUFSIZE)扩展为X_BUFSIZE, XAFTERX(BUFSIZE)扩展为X_1024。(X_TABLESIZE。预扫描总是执行完全展开。)
相关文章:
- 错误:无效的预处理指令 #i 的意思是 #if?
- C++预处理会生成变量成员、资源库和映射
- 使用预处理指令检查是否包含标头?
- 预处理的 C/C++ 文件是否特定于计算机?
- 使用 GCC 对 C 文件进行部分预处理(不删除 "define" 指令)
- 在 CPLEX 中求解线性规划,无需剪切和预处理
- CPP -D 选项,用于预处理 Fortran 代码
- 错误:粘贴"tmp_UINT"和"+"未提供有效的预处理令牌
- 任务计划程序库的预处理不起作用 - 多定义错误
- Eclipse 问题 - 编译期间不考虑 .c 和 .cpp 文件中定义的预处理
- 使用python预处理后,C++(opencv)中的垫子类型数据与image_to_array相同
- Howo 使用 cl 预处理为 masm 组装生成一个单独的文件
- 我有一个预处理的 C/C++ 源文件 (cacti.i).如何从这个 .i 文件生成可执行二进制文件,以便我可以像 ./
- 如何使用Visual Studio C/C++编译器(cl.exe)来预处理我的objective-C代码
- 是具有预处理前分支实现的结构违反ODR
- 与不完整的Cholesky预处理的共轭梯度返回特征库的意外错误
- Visual Studio C - 无法输出预处理文件
- 在海湾合作委员会中加快宏观预处理的任何方法
- 所有结构成员的预处理器批处理
- 当头文件被预处理时是否有一个预处理器选项显示?