本文共 2077 字,大约阅读时间需要 6 分钟。
1.预处理的使用
预处理在编译前对代码进行处理,按照我们的技巧方法进行对编译器的一种服务。
1) 预处理的定义分类
#include |
#define |
#ifdef....#else....#endif |
#include 、#define、#ifdef....#else....#endif只是预处理器能够识别的关键词。
#include 称为包含,包含什么呢?包含的是头文件。实际上包含这个头文件进行展开, 在前面的章节提到使用gcc -E 的时候可以看到预处理的文件内容。简单说就是你 include 头文件就是在当前位置中进行展开,展开最终目的是将展开的文件使用gcc进 行编译。
#define 称为宏,宏是用来做什么的呢?用来替换内容的。也就是我们看到#define最 终目的就是替换。替换是: 1) #define 宏名 宏体
注意:在宏名和宏体中至少要有一个空格,第1种替换方式是不进行语法检查的,具体 语法检查是在编译的过程中进行检查的。要注意的是你的宏体有可能在粗心马虎写错了 导致编译时出现问题。举个例子:
#include <stdio.h> #define num 3+6 int main(int argc,char* argv[]){ printf("sum is num:%d\n",num*9); return 0; } |
注意:在这里宏体没有加括号,所以导致结果不是自己想要的结果,因为3+6*9 =57,而 不是先算3+6=9,9*9 =81。我们的题本意是想将3+6先算再次乘以9得出结果为81。
我们讲结果改为如下
#include <stdio.h> #define num (3+6) int main(int argc,char* argv[]){ printf("sum is num:%d\n",num*9); return 0; } |
注意:这里的括号,括号是最大的优先级。
再举个另一个例子
#include <stdio.h> #define sum(x) (5+(x)) int main(int argc,char* argv[]){ printf("sum is num:%d\n",sum(3)); return 0; } |
注意1:总的理解宏就是安全情况下就是加括号,以上就是简单的宏的认识。
注意2:宏也有它的好处,如果宏体很长,就没有必要再写一遍,只要有了宏名,就能 展开一个宏体,也更好让代码具备可读性。宏基本上用于公有的或者需要实现很长的一 段代码情况下使用。
#ifdef....#else....#endif 是条件宏,条件编译有很多种这里举的是常见的一种,这种 跟条件语句非常像,但是有区别,区别在结束时需要endif。
2) 预处理宏的定义分类
__FUNCTION__ |
__LINE__ |
__FILE__ |
在C语言中还提供了预定义宏,以后看到了如:__FUNCTION__、__LINE__、__FILE__ 等单词就把它称为系统已经定好的宏,而且这些是gcc或者c语言定义好的,这些宏跟 操作系统关系不是很大,只要你使用C语言去翻译这些宏名都可以使用。这些预处理 宏在工程调试中用的非常多。这些宏的规律是什么呢?首先来看这些宏名全部都有两个 下划线组成,这种宏称为系统定义宏,大家在定义宏时请不要使用这种宏名。系统定义 好的宏是可变的,但是这种宏的宏体是什么我们是不知道的。例如:
__FUNCTION__ 就是指的是函数名。
__LINE__ 就是指的是行号。
__FILE__ 就是指的是文件名。
实战例子如下
strom@strom-PC:~/Downloads/linux_system/Learn/e/1$ cat welcome5.c #include <stdio.h> int main(int argc,char* argv[]){ printf("function is:%s\nfile is:%s\nnumber is:%d\n",__FUNCTION__,__FILE__,__LINE__); return 0; } |
编译输出的结果如下
strom@strom-PC:~/Downloads/linux_system/Learn/e/1$ gcc -o build2 welcome5.c strom@strom-PC:~/Downloads/linux_system/Learn/e/1$ ./build2 function is:main file is:welcome5.c number is:5 |
注意1:这里就验证了前面的说法,main 就是函数名,file 就是编译都c文件,line就 是指的是第几行的行号。
注意2:这个有什么好处呢?当在多个人合作编程的时候并且文件数有几百个文件数时 候一旦出错,你分辨不出来是谁的代码出错,这样可以在调试信息中加上这三个系统预 定义宏进行区分谁打印的时候出错,这个在调试中可以快速定位错误的地方。
转载地址:http://vduti.baihongyu.com/