博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2021年 ARM嵌入式实战 第4章 C语言预处理介绍
阅读量:4144 次
发布时间:2019-05-25

本文共 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/

你可能感兴趣的文章
2009年33所高校被暂停或被限制招生
查看>>
GlassFish 部署及应用入门
查看>>
iWatch报错: Authorization request cancled
查看>>
iWatch报错: Authorizationsession time out
查看>>
X-code7 beta error: warning: Is a directory
查看>>
Error: An App ID with identifier "*****" is not avaliable. Please enter a different string.
查看>>
iTunes Connect 上传APP报错: Communication error. please use diagnostic mode to check connectivity.
查看>>
3.5 YOLO9000: Better,Faster,Stronger(YOLO9000:更好,更快,更强)
查看>>
iOS菜鸟学习--如何避免两个按钮同时响应
查看>>
iOS菜鸟学习—— NSSortDescriptor的使用
查看>>
hdu 3790 hdoj 3790
查看>>
zju 1005 zoj 1005
查看>>
C语言8
查看>>
Qt实现简单延时
查看>>
qml有关矩形说明
查看>>
在qt中使用QSplitter设置初始比例setStretchFactor失效的解决方法
查看>>
repeater的使用
查看>>
qt msvc编译中文乱码解决
查看>>
qt实现点击出现窗口,点击其他任何地方窗口消失
查看>>
QML DropArea拖拉文件事件
查看>>