【发布时间】:2015-06-24 08:39:04
【问题描述】:
我的预处理器有个小问题让我很困惑,我在文档/预处理器/语言规范中找不到任何解释。
#define booboo() aaa
booboo()bbb
booboo().bbb
被预处理成:
aaa bbb <--- why is space added here
aaa.bbb
在处理三元组、续行和 cmets 之后,预处理器处理预处理器指令并将输入划分为预处理标记和空白。 booboo 的替换列表包含一个 pp-token,即标识符“aaa”。 booboo()bbb 分为 pp-tokens:'booboo'、'('、')'、'bbb'。 'booboo'、'('、')' 的序列被识别为功能宏调用,它应该扩展为 'aaa' 并且输出中的 imho 应该看起来像 'aaabbb'。我说看起来像 - 对人类来说 - 它看起来像一个标记,而编译器会得到 2 个标记“aaa”和“bbb”,因为没有使用允许 pp-token 连接的“##”运算符。当 'booboo().bbb' 导致 'aaa.bbb' 没有空格时,为什么/什么规则使 cpp(c 预处理器)在 'aaa' 和 'bbb' 之间放置额外的空格?
这是因为 cpp 试图使输出(主要是为人类)明确吗?人类无法判断 'aaabbb' 是由 2 个标记组成的,因为它只看到标记的拼写。我对吗?我已经阅读了关于预处理器的 C99 文档和 gcc 的 cpp 文档。我什么也没看到。
如果我是对的,我们这里也有类似的情况:
#define baba() +
baba()+
baba()-
结果:
+ +
+-
否则(如果 '++' 是输出)它会看起来像人类的 '++' 标记,但会有 2 个标记 '+' 和 '+'。是否像 '##' 运算符一样,cpp 检查连接是否产生有效令牌,但在所示情况下希望阻止人类执行连接? '+-' 没有歧义,因此没有添加空格
【问题讨论】:
-
值得注意的是:C 标准没有提到在编译过程中途停止的工具。
-
请注意,在 C 或 C++ 中,间距通常并不重要。
标签: c++ c c-preprocessor