12.26
#define DEBUG
#if DEBUG
#endif
会报错,得写成#define DEBUG 1
#if 后面可以跟的东西:
- 整数常量
- 字符常量
- 已定义的整型宏(展开到最后是整型或者字符型(本质都是整型))
- 表达式(加减乘除、逻辑运算、位运算之类的,感觉当成if看就行了)
注意以下规则:
- 表达式必须在预处理时完全可求值
- 所有操作数必须是整数常量
- 未定义的标识符当作0
- 表达式结果应为非0(真)或0(假)
#define FLAG aaa
#if FLAG
printf("True");
#else
printf("False");
#endif
FLAG会被展开成aaa,但是aaa被解析成一个宏名,但是不存在,未定义就是0,所以输出False而不是报错。
编译预处理有的运算符是不能用的:

#if和#ifdef可以嵌套#include(可以用于windows/Linux下面包含不同的头文件)
#if 0
#include <math.h>
#endif
#include <stdio.h>
int main() {
printf("%f\n", sqrt(3));
return 0;
}
这只会报warning,实际上是没有#include <math.h>,原因在于编译器隐式帮我们声明了一个int sqrt();,但是链接的时候就不检查函数参数类型,只看函数名。额很晕,算了不管了老师没讲就是不考。

浙公网安备 33010602011771号