2021年 ARM嵌入式实战 第4章 C语言预处理介绍

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:这个有什么好处呢?当在多个人合作编程的时候并且文件数有几百个文件数时 候一旦出错,你分辨不出来是谁的代码出错,这样可以在调试信息中加上这三个系统预 定义宏进行区分谁打印的时候出错,这个在调试中可以快速定位错误的地方。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

随行之旅

python国产化自动化

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值