一直模糊地以为, 这是预处理器中的重复.
#if MACRO_NAME
是把MACRO_NAME 替换, 判断替换后的内容是否为true, 如
#define MACRO_NAME 1
#if MACRO_NAME
# error "MACRO_NAME Defined"
#endif
会输出内容, 但如果上面定义为0 则不会.
正因为
#if MACRO_NAME 是执行一次宏替换, 所以如果定义为函数式的宏
#define MACRO_NAME(a) Do nothing
#if MACRO_NAME
# error "MACRO_NAME Defined"
#endif
是不会输出任何内容的, 因为MACRO_NAME是函数式的宏, 不符合可以被替换的规则.
另外
#if 后面可以接受很多的简单的数学运算, 位运算. 也有优先级结合性, 完全自成一家, 在这不展开这个
而
#if defined(MACRO_NAME)
是真正判断一个宏是否被定义了, 不管它的值是1还是0, 也不管它是否是函数式的宏.
阅读(771) | 评论(0) | 转发(0) |