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用什么数据类型来存储这个符号常量,它不是单引号括起来的字符,""
也不是整数或浮点数.
在实际编译#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)