目录
前言
条件编译指令多用于对头文件的定义和判断以及删除
头文件被包含的方式
本地文件包含(也就是自己创建的头文件):
#include "stdio.h"
本地文件包含的查找策略:
会现在源文件所在的目录下查找,如果该头文件没有查找到,编译器就会像查找库函数的头文件一样在标准位置查找该头文件,如果再找不到就会提示编译错误
库文件包含:
#include<stdio.h>
库文件包含的查找策略:
查找库里面的头文件时,编译器会直接去标准路径下查找,如果找不到就会提示编译错误
结论:
库里面的头文件也可以使用 "" 的形式包含,但这样的话查找头文件的效率就低了,且这样也不容易区分是库文件还是本地文件了,所以本地文件使用 "" 的形式包含,库文件使用 <> 的形式包含
嵌套文件包含
在一个工程项目里面,可能 .h 文件包含了其他 .h 文件,也有可能互相包含,这样的结果就会导致同一份 .h 文件出现多次,这样就造成了文件内容的重复
解决以上文件就需要使用到条件编译指令,来判断和删除头文件
使用条件编译指令规避头文件多次包含
代码演示:
#ifndef __TEST_H_
#define __TEST_H_
int Add(int x, int y);
#endif
以上代码的头文件为:#include "test.h"
代码解析:
#ifndef 编译指令的功能是:当后面的表达式为假的时候(也就是没有定义时)就执行中间的代码,否则就不执行,且头文件为 test.h ,那么要使用 #ifndef 来判断的话,最好是将 test.h 写成 __TEST_H_ 的形式,便于理解
当其他头文件包含此 test.h 头文件时,也就是当程序第一次进入此头文件的时候,程序肯定没有包含过此头文件,所以 #ifndef 判断就会为假,#ifndef 中的代码就会执行,且 #define 就会定 义 __TEST_H_ 这个头文件
所以当第二次以后其他头文件包含此文件时,#ifndef 判断就会为真,#ifndef 中的代码就不会再执行
这样就规避了同一份 .h 文件出现多次,且文件内容重复的情况
还有一个编译指令,同样能做到以上功能
代码演示:
#pragma once
只要将这条指令放在头文件的最开始位置,也同样能实现以上功能