以下C代码的输出是T T,但我认为应该是t t.
#include<stdio.h>
#define T t
void main()
{
char T = 'T';
printf("\n%c\t%c\n",T,t);
}
Run Code Online (Sandbox Code Playgroud)
预处理器不会对引号内的任何文本执行替换,无论它们是单引号还是双引号.
所以字符常数'T'不变.
从C标准的 6.10.3节:
9表单的预处理指令
Run Code Online (Sandbox Code Playgroud)# define identifier replacement-list new-line定义一个类似对象的宏,它使宏名称171)的每个后续实例被构成指令其余部分的预处理标记的替换列表替换.然后重新扫描替换列表以获取更多宏名称,如下所示.
171)由于宏替换时间,所有字符常量和字符串文字都是预处理标记,而不是可能包含类似标识符的子序列的序列(见5.1.1.2,翻译阶段), 因此永远不会扫描它们的宏名称或参数.
TL;DR变量名T需要进行 MACRO 替换,而不是初始化程序'T'。
详细地说,#define宏会导致文本替换,“引号”内的任何内容(或者''或"")都不是宏替换的一部分。
因此,本质上,尝试在代码上运行预处理器(例如gcc -E test.c:),它看起来像
char t = 'T';
printf("\n%c\t%c\n",t,t);
Run Code Online (Sandbox Code Playgroud)
运行gcc -E main.c -o test.txt && tail -f test.txt并See it online
预期会打印变量,的值。tT T
也就是说,对于托管环境,所需的签名至少main()是。int main(void)