调试环境:vs2015+win10
C预处理器就是将源文件经过一些简单的处理,最常用的是删除注释、处理#include指令和处理#define指令。
文件包含
#include
指令:用于在编译期间把指定文件的内容包含仅当前文件中,这样可以使大量的指令和声明更加方便。
引入方式:
#include<filename>//引入库里面的文件
#include"filename"//首先会在本地文件里面查找,未找到在去库里面查找
作用就是将文件中的内容复制到本文件中,整合成一个文件。
在filename中一般存放引入的其他文件声明、宏定义、extern声明、全局变量、函数声明、结构体定义。
宏替换
宏定义形式:#define 名字 替换文本
此条语句之后所有出现名字记号的地方都将被替换为替换文本,如果替换文本比较长可以使用’\’当做续航符。
宏定义对双引号之间的内容不影响,如果不想使用该宏定义可以使用“#undef 名字 ”来取消宏定义。
使用宏定义时应该是注意它的使用方法。
如果宏定义带了参数使用时就应该注意以下两点:
每个参数在使用时需要用圆括号括起
传参时不能传带副作用的参数,如:自加、自减运算
#define max(a,b) a>b?a:b
#define div(a) a/a
//上面两种情况都会引发错误
//如果传入带有副作用的参数如i++,上下两个宏都会返回错误的值
//如果第二个宏传入参数是2+3,则会被翻译成2+3/2+3,这样结果与实际结果大相径庭
//为了不出现上述的情况,传参时有以下要求:
//不要传带有副作用的参数,如自加、自减运算
//在宏里面每一个参数都应该用圆括号括起,必要时每个子句也应用圆括号括起
在宏里面提供了“#”和“##”运算符
“#“:防止该变量与替换文本相同,使用它可以不用转换
“##”:在宏里面可以使用它,将两个字符串连接起来
详细内容可以访问查看本篇博客:http://blog.csdn.net/baidu_27435045/article/details/52948354
条件包含
在预处理阶段使用条件语句对预处理进行控制
通常使用
#if //与if相同
#ifundef //如果没有定义
#else //与else相同
#elif //与else if相同
#endif //结束最近的一个#if或#ifundef
例如
#ifundef __BUG_TEST__
#define __BUG_TEST__
//do something
#if __TEST_a__==a
//do something
#elif __TEST_a__==b
//do something
#endif
#endif
上面的代码可以防止头文件重复引用,是一种非常实用且常见的方式。
如何选择是程序猿自己根据具体情况所定,毕竟程序猿都是有个性的。