以下C代码的输出是TT,为什么不tt?

Anj*_*mar 5 c macros

以下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)

dbu*_*ush 8

预处理器不会对引号内的任何文本执行替换,无论它们是单引号还是双引号.

所以字符常数'T'不变.

C标准的 6.10.3节:

9表单的预处理指令

# define identifier  replacement-list  new-line
Run Code Online (Sandbox Code Playgroud)

定义一个类似对象的宏,它使宏名称171)的每个后续实例被构成指令其余部分的预处理标记的替换列表替换.然后重新扫描替换列表以获取更多宏名称,如下所示.

171)由于宏替换时间,所有字符常量和字符串文字都是预处理标记,而不是可能包含类似标识符的子序列的序列(见5.1.1.2,翻译阶段), 因此永远不会扫描它们的宏名称或参数.


Sou*_*osh 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.txtSee it online

预期会打印变量,的tT T

也就是说,对于托管环境,所需的签名至少main()是。int main(void)