嵌入式C语言编程中经验教训总结(四)条件编译的合理使用

34 篇文章 2 订阅
33 篇文章 2 订阅

嵌入式C语言编程中经验教训总结(四)

条件编译

在c语言中,条件编译是指预处理器根据条件编译指令,选择源程序代码中的一部分代码作为输出,送给编译器进行编译,有选择性地执行相应操作,常见的条件编译指令如下表 所示。

在这里插入图片描述其调用格式主要有:

方式1:

在这里插入图片描述其功能为:如果#if后的条件表达式为真,则执行程序段 1,否则执行程序段 2

方式2:

在这里插入图片描述利用条件编译的上述特性,有技巧的使用,可以提高系统代码的可读性、健壮性。

利用条件编译防止重定义

在较大的系统设计中,往往会采用模块化的编程,多个功能模块开发时同步进行,而有些参数、配置项等,在不同模块往往都会用到,例如在fft开发中,PI的值会在多个源文件中使用,当然可以如下定义:

#define PI 3.1416
但是,不同的模块、不同工程师在实现中,就会用多出定义,甚至出现了:
某个源文档定义:
#define PI 3.14
另一个文件定义:
#define PI 3.1415926
这样不仅仅重复定义,还会造成计算精度上的误差,为了避免这种现象,我们可以使用条件编译的方式,在定义前检测程序中是否已经定义了名字为某标识符的宏,如果没有定义该宏,则定义该宏,否则使用现有的定义,代码如下:

#ifndef PI
#define PI 3.1416
#endif

上述程序段,用于判断是否已经定义了名为 PI 的宏,如果没有定义 PI,则执行
#define PI 3.1416
的宏定义,就避免了上面的重复定义和精度不一致问题。

利用条件编译过滤log信息

在代码编写过程中,在正式发布之前,往往会在代码中预置许多的调试信息,这些调试信息通过log输出的方式,可以帮助我们判断程序的走向,编译排查故障和系统测试,但是到了发行截断,这些调试信息往往就不需要了(或者要对最终用户屏蔽),怎么能高效地完成test版本和release版本的切换呢:是直接删除?或是大面积注释掉?有了条件编译后,就可以利用条件编译来一键关掉调试信息
举个例子:

#include <stdio.h>
#define DEBUG

int fun()
{
int i = 0;
int SendBuff[10] = { 0 };
for (i = 0; i < 10; i++){
SendBuff[i] = i;
#ifdef DEBUG //如果定义了 DEBUG 就编译下面的代码
printf(“%d\n”, SendBuff[i]);//为了观察数组是否赋值成功。
#endif //结束条件编译
}
return 0;
}

其中#ifdef DEBUG定义了当前是调试模式还是release模式,在DEBUG模式下,就编译printf行的代码。输出调试信息,方便我们检测是否正确,到软件release时,只有关闭DEBUG开关,所有的在此条件下的log信息就一键关闭了,是不是高效方便?。

利用条件编译防止头文件重复包含

c语言中,包含头文件在编译时会将该头文件中的东西完整复制一遍。如果我们的程序多次调用同一个头文件,那么调用时也会多次调用,使得编译代码十分冗余,不仅如此,如果头文件里包含了函数、变量等声明,编译器还会爆出重复定义的错误,该如何防止这种情况呢?利用你条件编译可以让头文件只被包含一次的目的,实现方法如下:
例如对:test.h的头文件,多个源文件都需要,我们可以这么定义:

#ifndef TEST_H
#define TEST_H

//头文件的内容

#endif

因为有了#ifndef __TEST_H__的条件判断,表示没有定义__TEST_H__时才会执行头文件的内容的代码,当第一次包含该头文件时,TEST_H__确实没有被定义,于是执行该头文件中的所有代码。但是第一次执行后,因为下一句就是定义#define TEST_H,所以第一次执行该头文件中的代码后,下一次再用#ifndef判断时,因为第一次包含头文件时已经定义了__TEST_H,那么下面的代码就不会再执行了,这样就达到了只包含一次头文件的目的!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

cyjbj

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值