预定义符号
预定义符号都是语言内置的,下面是一些常用的。
宏定义预处理指令
#define
#define预定义标识符
语法规则:#define 标识符名 内容(标识符名通常为大写)内容可以是值、关键字、甚至是一段代码
如果定义的内容过长,可以分成几行写,除了最后一行外,每行的后面都加一个'\'(续行符)
宏定义预定义宏define机制包括了一个规定,允许把参数替换到文本中(只是替换,不能传参),这种实现通常称为宏(macro)或定义宏(define macro)
语法规则:#define 宏名(参数) 内容(宏名通常为大写)预定义宏只是文本的替换,不是像函数一样可以传参
用于对数值表达式进行求值的宏定义都应该用这种方式加上括号,避免在使用宏时由于参数中的操作符或邻近操作符之间不可预料的相互作用
宏通常被应用于执行简单的运算。比如在两个数中找出较大的一个。 简单运算中宏相对函数的优点
简单运算中宏相对函数的缺点
一般来讲函数和宏的使用语法很相似。所以语言本身没法帮我们区分二者。因此平时习惯将宏名全大写,函数名不是全大写,单词首字母大写
#define替换规则
注意:
#与和##的作用就是将参数插入到字符串中。字符串是有自动连接特点。那么可以实现如下代码
还可以用#实现。这里'#'的作用就是将10变成一个字符串。也可以实现如下代码
这里##可以把位于它两边的符号合成一个存在的标识符
条件编译预处理指令
#if
语法规则:#if 常量表达式···#endif如果常量表达式为1,就编译#if-#endif间的代码段,否则相当于没有#if-#endif间这段代码
这里DEBUG为1,那么就编译#if-#endif间的代码段。这个预编译指令与C程序中的if-else相似,也可以多分支和嵌套使用
#if defined()&ifdef
语法规则:#if defined(标识符)···#endif如果标识符被定义过,就编译#if defined(标识符)-#endif间的代码段,否则相当于没有#if defined(标识符)-#endif间这段代码。与此相对应的是#if !defined(标识符)···#endif,与#if defined(标识符)···#endif,其功能正好相反
这里DEBUG被定义过,那么就编译代码段。这里也可以使用#ifdef实现相同的功能,当然也有与此相对应的ifndef,其功能与ifdef是相反的
语法规则:#ifdef标识符···#endif
同样的,这个预编译指令与C程序中的if-else相似,也可以多分支和嵌套使用
文件包含预处理指令
当然用本地文件包含也可以查找库文件中的文件,只是本地文件包含会优先查找源文件所在目录,然后再查找库文件中的文件。这样效率会低一些
在程序编译时,会先预编译,预编译会将#define宏定义的内容替换和包含的头文件替换,当一个文件中包含多个相同的头文件,那么头文件就会被替换多次,相当于多份头文件中的内容出现在文件中。这样会影响编译的效率
因此使用条件编译的方式解决,即在每个头文件首部写这样代码段
或者如下代码段
这样就可以避免头文件的重复引入