前言
C语言中的预处理功能有三种,分别是宏定义,文件包含和条件编译,这里说的就是”条件编译”.
其实看名字就能看出来,满足一定条件才进行编译,是给编译器看的.
只要学过if else语句的人,就能很容易理解这个.
#ifdef
就是”if define”的意思,即”如果定义了”1
2
3
4
5#ifdef 标识符1
程序段1
#else
程序段2
#endif
如果定义过标识符1,那就执行程序段1,负责执行程序段2.也可以有如下用法:1
2
3#ifdef 标识符1
程序段1
#endif
#ifndef
“if not define”,如果没有定义过.1
2
3
4
5#ifndef 标识符1
程序段1
#else
程序段2
#endif
如果没有定义过标识符1,就执行程序段1,负责执行程序段2.也可以有如下用法:1
2
3#ifndef aaa
#define aaa a*a*a
#endif
#if
1 | #if 表达式1 |
作用&例子
- 防止重复定义
当你在a.h中定义了一个”某变量”,然后在b.h中包含了a.h的头文件,接着在c.h中包含了a.h的头文件,最后你又在test.c中包含了a.h和c.h两个头文件.这样就相当于你在test.c中定义了两遍某变量啊,c语言是不允许重复定义的(声明是可以重复的),所以你得告诉编译器,我如果定义过某变量你就别再给我编译这句话了,如果没定义过,再编译. - 举例
a.h1
2#include <stdio.h>
#include "b.h"
b.h1
#include "a.h"
c.c1
2
3
4
5#include "a.h"
#include "b.h"
int main(){
printf("Hello!");
}
这样在c.c中会编译错误,将b.h改为如下就可以解决这个问题.
b.h1
2
3
4#ifndef _A_H
#define _A_H
#include "a.h"
#endif
- 用于注释代码
1
2
3
4
5
6
7
8
9
10
11
12
13#include <stdio.h>
#define CONFIG_DEBUG
int main(){
FILE *fp;
fp=fopen("D:\\DEV\\test.txt","r");
if(NULL==fp){
printf("error!");
}
#ifdef CONFIG_DEBUG
printf("open test.txt ok");
#endif
return 0;
}
当不想让程序执行输出语句时,把#define CONFIG_DEBUG注释掉就行了.
PS:1
2
3
4#define
其实是
# define
只要有一个#就表示是预处理语句了!
参考
https://blog.csdn.net/weixin_41656968/article/details/80493923
https://baike.baidu.com/item/%23ifndef/2835043?fr=aladdin
欢迎与我分享你的看法。
转载请注明出处:http://taowusheng.cn/