预处理详解2(7.17)

3.2.7命名约定

一般来讲宏和函数的语法是比较相似的,语言本身没办法帮助我们区分二者。

因此需要借助一个习惯:

把宏名全部大写

函数名不要全部大写

预处理详解2(7.17)_第1张图片

 3.3 #under

该指令用于移除一个宏定义

预处理详解2(7.17)_第2张图片

 3.4命令行定义

 vs无法演示,这里用 gcc 演示。

在代码中不初始化sz,在命令行中定义sz的值

预处理详解2(7.17)_第3张图片

 3.5条件编译(预处理阶段)

在编译一个程序的时候,如果我们使用条件编译指令,那么我们要将一条语句(一段语段)编译或者放弃是很容易的,以此让一个文件的代码可能适用多个场景或平台。

3.5.1 

如果满足 #if 后面的条件语句,那么直到 #endif 的语段都编译,不满足就不编译并删除该语段(预处理阶段)。

预处理详解2(7.17)_第4张图片

3.5.2多个分支的条件编译

预处理详解2(7.17)_第5张图片

 原理同 if; else if; else语句相同

由此可以实现不同条件下的选择性编译语句(语段)。预处理详解2(7.17)_第6张图片

 3.5.3判断是否被定义

预处理详解2(7.17)_第7张图片

 举例:

预处理详解2(7.17)_第8张图片

 3.5.4嵌套指令

预处理详解2(7.17)_第9张图片

 用条件编译写注释

预处理详解2(7.17)_第10张图片

3.6文件包含

#include 可以使另一个文件被编译。

3.6.1头文件包含的方式

头文件的包含有两种方式,包含自己的文件用“  ”,包含库里的文件用< >。

包含自己的文件 

预处理详解2(7.17)_第11张图片

包含库文件

 

 查找头文件直接去库的标准化路径下查找(不会在当前文件所在路径下查找),如果找不到就提示编译错误。

 问:对库文件是不是也能用“  ”形式包含?

 是的,不过这样查找的效率低一些,并且也不容易区分是库文件还是本地文件。

 3.6.2嵌套文件包含

如果出现这样的场景:

预处理详解2(7.17)_第12张图片

 comm.h 和comm.c 是公共模块。

test1.h和test1.c使用了公共模块。

test2.h和test2.c使用了公共模块。

test.h和test.c使用了test1模块和test2模块。

这样最终程序会出现两份comm.h内容,这样就造成了文件内容的重复。

如何解决这个问题呢?

1.条件编译(任何编译器都支持)

预处理详解2(7.17)_第13张图片                                                                                                   

在头文件开头加上这些内容,判断是否被定义,如果未被定义,则进行定义,并编译头文件中的内容。

2.(较为现代的写法,早期编译器不支持)

在头文件开头这样写,也是让该头文件只被包含一次。

4.其他预处理指令

预处理详解2(7.17)_第14张图片

你可能感兴趣的:(c语言)