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而不是报错。

编译预处理有的运算符是不能用的:

屏幕截图 2025-12-26 105403

#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();,但是链接的时候就不检查函数参数类型,只看函数名。额很晕,算了不管了老师没讲就是不考。

posted @ 2025-12-26 11:33  Zlc晨鑫  阅读(3)  评论(0)    收藏  举报