以奇怪的方式使用#define预处理程序指令

car*_*995 2 c identifier c-preprocessor

今天我刚刚完成阅读并在C上试验如何使用#define创建清单常量,之后我想到了一些东西,下面是代码.

#include <stdio.h>
#define dummy main
#define yam {
#define apple }

int dummy(void)        //constant substitution main with dummy
yam                          // constant substitution { with yam
  printf("It works!!\n");
  return 0;
apple                           //constant substitution } with apple
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,它就像魅力一样,我只是想知道为什么这样的东西不会导致任何错误,也许我可以理解为什么main()可以替换因为main是一个标识符(赋予函数,变量和常量的名称),但为什么{}也可以用符号名称代替?第二件事是,C用什么数据类型来存储这个符号常量,它不是单引号括起来的字符,""也不是整数或浮点数.

Chr*_*per 7

实际编译#define程序之前,语句由预处理器进行评估,因此编译器永远不会看到yam.预处理器执行直接文本替换.

也就是说,当编译器看到你的代码时,它看起来像这样:

int main(void)        //constant substitution main with dummy
{                          // constant substitution { with yam
  printf("It works!!\n");
  return 0;
}                           //constant substitution } with apple
Run Code Online (Sandbox Code Playgroud)