转自:http://blog.163.com/cht_sky/blog/static/461424862007915103626769/
2.5.3 声明指令声明指令用于定义或取消定义条件编译符号。
pp-declaration:(pp 声明:)
whitespaceopt # whitespaceopt define whitespace conditional-symbol pp-new-line(空白可选 # 空白可选 define 空白 条件符号 pp 新行)
whitespaceopt # whitespaceopt undef whitespace conditional-symbol pp-new-line(空白可选 # 空白可选 undef 空白 条件符号 pp 新行)
pp-new-line:(pp 新行:)
whitespaceopt single-line-commentopt new-line(空白可选 单行注释可选 新行)
对 #define 指令的处理使给定的条件编译符号成为已定义的(从跟在指令后面的源
取消
定义一个本来已经是未定义的条件编译符号。下面的示例定义一个条件编译符号 A,然后两次取消定义该符号;第二个 #undef 没有作用但仍是有效的。
#define A
#undef A
#undef A
如果你想定义这个宏那就#define X
如果你不想让你已经#define X的宏在其他其他地方由于引入了这个包含宏的.h文件而引起一些编译问题,那你就#undef X掉,就这么简单。
举个简单的例子。
有1.c,11.h,12.h三个文件
其中在11.h中定义了#define X extern
x int a;
而在12.h中你又定义了#define X int
x b;
而在1.c中同时包含了这2个头文件,那就会引起一些问题,此时你必须把其中一个或者这两个都#undef掉来确保宏的正常。
#undef只是撤消掉掉原来定义的宏,
但是不会取消掉你已经用这个宏定义的变量
#define X extern
x int a;
#undef X
你仍然可以使用这个a,但不能用X了,当然你再定义X成什么就随便了
你也可以再定义成
#define X extern
x int a;
#undef X
#define X int
X b;
#undef X