c++/c中的预编译处理:
预编译伪指令一般以#开头,前面只能是空白字符,其本身不是c/c++语句,可以出现在程序的任何地方,只要其展开后复合语法规则并且有效即可,其位置可以是头文件,函数体,控制结构,类定义,命名空间等。
注意:
预编译处理器对预编译伪指令进行处理后生成中间文件作为编译器的输入,所以预编译伪指令都不会进入编译阶段,即:不会被编译,所以assert宏对项目本身是没有影响的。
包含文件#include,宏定义#define,条件编译#ifdef以及一些不常用的预编译伪指令和符号常量对代码的可移植性和清晰性相当有好处。
文件包含伪指令:
#include
此伪指令用于包含一个头文件,之前说过头文件中出现一般会存放某模块接口声明,公共数据等,编译器预处理器扫描到了这条伪指令后,会用对应的文本内容替换它。
语法形式:
文件包含伪指令有两种语法形式,即后接<>和后接“”
前者用来包含开发环境提供的库头文件,例如等
后者用来包含程序员编写的头文件,后接“”双引号会指示编译器在当前工作目录下搜索头文件,找不到了再到开发环境设定的路径中去查找。
使用该伪指令时,头文件可以加相对路径或者绝对路径,例如#include“.\mytest\abc.h”,或者#include"C:\myproject\mytest\abc.h"。
与#include配合使用的包含卫哨,内部包含卫哨(头文件保护)和外部包含卫哨。
名字非常花哨但是意思很好理解,一个头文件可以被不同文件包含,如果某个文件无意间包含了一个头文件两次,该头文件中出现的内容就会发生重定义而报错,这种情况也称重复包含。
包含卫哨(头文件保护)可以避免重复包含的事情发生:
内部包含卫哨:
通过使用预处理器的一组标志宏,即
#ifndef _HEADER_H_ #define _HEADER_H_//头文件内容#endif
将头文件中的所有内容都写在#define和#endif内部,这是内部包含卫哨的使用方式,通过这个就可以放心的在其他文件中包含有内部包含卫哨的头文件了,写在被包含的头文件中。
解析: 这个操作可以防止一个头文件被多次包含,在编译器对文件进行编译时,如果遇到包含一个头文件,第一次会成功编译,并define相应的标志宏开关,开关本身的名词并不影响,第二次遇到同一个头文件,因为已经define了标志宏,#ifndef不成立,编译器就不会再次编译该头文件,而是会跳出该头文件回到包含该头文件的地方。
外部包含卫哨: 内部包含卫哨防止了头文件被重复编译,但每次编译器扫描到#include时都需要展开指令,搜索并打开头文件,判断标志宏开关后再回去,会降低编译速度,写在需要包含头文件的文件中
外部包含卫哨的写法:
#if!defined(_HEADER_H_)#include <header> #define _HEADER_H_#endif
建议外部包含卫哨和内部包含卫哨使用同一个标志宏,就可以少定义一个标志宏了。 可以仅在头文件中包含其他头文件时使用外部包含卫哨,源文件中可以不使用,也基本不会影响编译速度。