gpt4 book ai didi

没有标记字符串的宏的 cpp 扩展

转载 作者:太空狗 更新时间:2023-10-29 17:07:38 24 4
gpt4 key购买 nike

我正在阅读 CPP 宏扩展,并想了解未提供(可选)标记字符串时的扩展。我发现 gcc v4.8.4 是这样做的:

$ cat zz.c
#define B
(B)
|B|
$ gcc -E zz.c
# 1 "zz.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "zz.c"

()
| |

谁能解释为什么扩展在一个实例中是零空间而在另一个实例中是零空间?

最佳答案

C 预处理器对“标记”进行操作,只要有可能改变含义或歧义,它总是会添加空格以保留含义。

考虑你的例子,

(B)

无论 B 的宏值如何,在 () 之间是否添加空格都没有歧义或意义改变。

但是

却不是这样
|B|

根据宏 B,上面的内容可以是 |||something|。因此预处理器被迫添加一个空格以保持 C 的词法规则。

任何其他可能改变含义的标记都可以看到相同的行为。例如,

#define B +
B+

会产生

+ +

相对于

++

出于上述原因。

然而,这只是符合C词法规则的预处理器。 GCC 确实有并支持一个名为 traditional 的旧预处理器processor 不会添加任何额外的空格。例如,如果您以传统模式调用预处理器:

gcc -E -traditional-cpp file.c

然后

#define B 

(B)
|B|

产生(没有空格)

()
||

关于没有标记字符串的宏的 cpp 扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30813619/

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