31天C语言进阶——9,预编译

小复习

预处理,预编译是编译的第一步。

会有三件基本的事情发生:

  1. 引入#include
  2. 去除注释
  3. 修改#define

1,内置符号

这些符号都可以直接使用:

__FILE__			点c文件全名
__LINE__			当前行号
__DATE__			编译日期
__TIME__			编译时间

举例:

#include<stdio.h>

int main() {
    
    
	printf("文件全名:%s\n", __FILE__);
	printf("当前运行行号:%d\n", __LINE__);
	printf("编译日期:%s\n", __DATE__);
	printf("编译时间:%s\n", __TIME__);
	return 0;
}

效果:

在这里插入图片描述

2,自定义符号

#define 名 值

不带分号。预编译阶段,所有名字会被值替换。

举例:给printf取个别名。

#include<stdio.h>

#define say printf
int main() {
    
    
	say("你好,世界!\n");
	return 0;
}

效果:

在这里插入图片描述
举例:自定义一个死循环符号。

#include<stdio.h>

#define loop while(1)
int main() {
    
    
	int i = 0;
	loop{
    
    
		if (i > 1000) {
    
    
			break;
		}
		else {
    
    
			printf("你好,世界!\t%d\n",i);
			i++;
		}
	}
	return 0;
}

效果:

在这里插入图片描述

3,自定义宏

和自定义符合差不多。

相当于函数,只不过在预编译的阶段就会执行。
然后替换掉。

#define ( 参数列表 ) 表达式

举例:输出字符串。

#include<stdio.h>

#define say(s)printf(s)
int main() {
    
    
	say("你好,世界!\n");
	return 0;
}

效果:

在这里插入图片描述
替换逻辑:递归。
看参数有没有define,有就套娃。
直到没有,替换自己。

字符串内部的符号会被忽略。

4,条件编译

可以用#define定义一个符号,代表是否要执行。

#include<stdio.h>

#define __DEBUG__ 1
int main() {
    
    
	if (__DEBUG__) {
    
    
		printf("调试模式开启\n");
	}
	else {
    
    
		printf("调试模式关闭\n");
	}
	return 0;
}

效果:

在这里插入图片描述

同时,可以让这段代码直接跳过编译。

#include<stdio.h>

#define __DEBUG__ 1
int main() {
    
    

#if __DEBUG__
	printf("调试模式开启\n");
#endif

	return 0;
}

这种写法也有配套的选择分支。

#include<stdio.h>

#define __DEBUG__ 0
#define __WARN__ 1
int main() {
    
    

#if __DEBUG__
	printf("调试模式\n");
#elif __WARN__
	printf("警告模式\n");
#else
	printf("正常模式\n");
#endif

	return 0;
}

效果:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_37284843/article/details/124522408