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\n", TEST); return 0; }
编译一下会发现:
结合这个warning就容易理解了,对于第三行来说,宏的主体有三个分别是1 、+、 3共三个语言符号,第四行的宏主体的同样是1 、+、 3共三个语言符号,而不管这三个语言符号之间有几个空格或TAB制表符,但第五行的宏主体只有1+3一个语言符号,因此第五行出现警告说宏被重定义了,而第四行虽然重定义了但是宏的主体和原来是一样的所以没有报warning。对于宏的重定义不同编译器采用不通的策略。