C语言中的#define预处理指令

本文链接:http://www.cnblogs.com/xxNote/p/4009460.html

今天看C Primer Plus里面看449页里面 16.2.1语言符号 讲到从技术方面看,系统把宏的主体当作语言符号类型字符串,而不是字符型字符串。这句话感到不是很理解,结合450页的那个例子自己写个小程序测试一下:

#include <stdio.h>
#include <STDLIB.H>
#define TEST 1	+	3
#define TEST 1 + 3
#define TEST 1+3
int main(void)
{
	printf("%d
", TEST);

	return 0;
}

编译一下会发现:

结合这个warning就容易理解了,对于第三行来说,宏的主体有三个分别是1+ 3共三个语言符号,第四行的宏主体的同样是1 + 3共三个语言符号,而不管这三个语言符号之间有几个空格或TAB制表符,但第五行的宏主体只有1+3一个语言符号,因此第五行出现警告说宏被重定义了,而第四行虽然重定义了但是宏的主体和原来是一样的所以没有报warning。对于宏的重定义不同编译器采用不通的策略。

原文地址:https://www.cnblogs.com/xxNote/p/4009460.html