2016-12-14 68 views

回答

2

TL; DR变量名T受到宏替换,而不是初始化'T'


要精心,#define宏导致“引号”(无论是''"")内的文本替换和什么都没有宏替换的一部分。

所以在本质上,尝试在你的代码运行的预处理器(例如:gcc -E test.c),它看起来像

char t = 'T'; 
printf("\n%c\t%c\n",t,t); 

Run gcc -E main.c -o test.txt && tail -f test.txt and See it online

其中,果然,打印变量tT T

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

+1

你是不是指'T T'? – DBPriGuy

+0

@DBPriGuy对,我的坏。部分编辑。 –

+1

@SouravGhosh但是输出是T T而不是t t。 –

8

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

所以字符常量'T'不变。

C standard第6.10.3:

形式

# define identifier replacement-list new-line 

的预处理指令定义了一个类似对象的宏引起的 宏每个后续实例名称171)将被替换列表 预处理令牌替换,该预处理令牌构成的其余部分指令。然后重新扫描替换列表以获取更多宏名称,如下所述。

171)由于,通过宏观更换时间,所有字符常量和 字符串文字预处理标记,不序列可能含 类似标识符的子序列(见5.1.1.2,翻译 相),他们从不被扫描宏名称或参数。

相关问题