我的预处理器有一个小问题困扰我,我在文档/预处理器/语言规范中找不到任何解释.
#define booboo() aaa
booboo()bbb
booboo().bbb
Run Code Online (Sandbox Code Playgroud)
被预处理成:
aaa bbb <--- why is space added here
aaa.bbb
Run Code Online (Sandbox Code Playgroud)
处理三字符,连续行和注释后,预处理器处理预处理器指令并将输入分为预处理标记和空格.booboo的替换列表包含一个pp标记,它是标识符'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个令牌组成的,因为它只能看到令牌的拼写.我对吗?我已经阅读了关于预处理器和gcc的cpp文档的C99文档.我什么也看不见.
如果我是对的,我们在这里有类似的情况:
#define baba() +
baba()+
baba()-
Run Code Online (Sandbox Code Playgroud)
结果是:
+ +
+-
Run Code Online (Sandbox Code Playgroud)
否则(如果'++'是输出)它会看起来像'++'令牌,但会有2个令牌'+'和'+'.是否与'##'运算符一样,cpp检查串联是否产生有效令牌但是在显示的情况下想要阻止人类执行串联?'+ - '不含糊,因此没有添加空格
为什么以下代码的输出值为5?
#include<stdio.h>
#define A -B
#define B -C
#define C 5
int main()
{
printf("The value of A is %d\n", A);
return 0;
}
Run Code Online (Sandbox Code Playgroud)