C 预处理器 - 标记粘贴 - 令人困惑的结果。这是为什么?

C preprocessor - token pasting - confusing result. Why is that?

我以为这个程序会打印值 -12--2=-10。当我 运行 它时,它打印 0.

我不明白为什么?有什么提示吗?

#include <stdio.h> 
#define        ALPHA(x,y)        x##2-y 

int main(void) {
    int i = -1;
    int i2 = -2;
    printf("%d", ALPHA(i, i2));
    return 0;
}

ALPHA(i, i2) 变为 i2-i2

根据上面的评论,预处理是在编译发生之前进行文本替换。

预处理阶段在任何编译之前完成,并且是在文本上完成的。它没有变量或类型的概念(即编译阶段),更不用说实际值(运行时)了。

所以,你正在做的是:

1) ALPHA(i, i2)
2) i##2-i2
3) i2-i2

所以你最终得到 printf("%d", i2-i2) 打印零。

预处理器将输出为:

#include <stdio.h> 

int main(void) {
    int i = -1;
    int i2 = -2;
    printf("%d", i2-i2);
    return 0;
}

所以它会打印零

您混淆了 i1 字符。尝试不同的文本编辑器字体。

i ## 2 产生 i2 恰好在你的程序中有效,值为 -2.

需要

1 ## 2 才能获得预期的 12.

这并不能说明您似乎期望的负号,但我仍然喜欢这个理论。

与其他编程语言相比,C 中的编译过程略有不同。 在 C 中,3 个阶段 涉及从 .src 文件获取 .exe 文件。

xyz.c -> 预处理器 -> tmp.c (临时)-> COMPILER -> xyz.obj-> LINKER -> xyz.exe

基本上,预处理器逐行读取您的代码,如果它是预处理语句,那么它只会执行预处理指令并将您的代码以纯文本形式输出到编译器。

对于您的代码,预处理器会将此代码发送给编译器进行编译:

 //includes stdio.h from include folder

    int main(void)
    {
        int i = -1;
        int i2 = -2;
        printf("%d", i2 - i2);
        return 0;
    }

因此,当编译器编译此代码时,它会给出 结果 以仅打印为 0。 这就是当您是 运行 代码时打印 0 的原因。 希望这会帮助你。