相信有不少人看到 #ifndef #define #endif 的代码时,都会感到陌生,下面我们以AFNworking头文件为例,来深入的解析一下这到底是个什么东西:
AFNeworking.hifndef/define/endif 到底是个什么东西?
这是C++预编译头文件保护符,保证即使文件被多次包含,头文件也只定义一次。目的是防止头文件的重复包含和编译。
通俗点来说,当编译器第一次编译头文件 AFNeworking.h 的时候,会定义 _AFNETWORKING_ ,然后如果还有文件引用了该头文件,但 _AFNETWORKING_ 已经被定义了,所以就不会再去编译你的头文件添加的内容。这就是条件编译。
那么什么情况下文件会被多次包含呢?
举个栗子🌰:
在一个大的软件工程里面,可能会有多个文件同时包含 AFNetworking.h 头文件,假如 AFNetworing.h 头文件没有加上这段 #ifndef #define #endif 的代码 ,那么当这些文件编译链接成一个可执行文件时,就会出现大量重定义 _AFNETWORKING_ 的错误。而在 AFNetworking.h 头文件中使用 #ifndef #define #endif 就能避免头文件的重定义。
那么在我们的工程里面如何使用?
例如要编写头文件 example.h
在头文件开头写上两行:
#ifndef _EXAMPLE_H_ //头文件开头写上这一行
#define _EXAMPLE_H_ //这里取名称一般是文件名的大写
import "xxx.h" //导入相关的头文件,按具体需要
#endif //头文件结尾写上一行
*标识的命名规则一般是头文件名全大写,前后加下划线,并把文件名中的“.”也变成下划线。当然自由命名也是可以的,_AFNEWORKING_ 就将后面的_H省略了。
这样一个工程文件里同时包含两个 example.h 时,就不会出现重定义的错误了。
网友评论