找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 0|回复: 0
收起左侧

第14章 实践项目开发——智能温控系统14.4

[复制链接]
ID:1167894 发表于 2026-5-13 09:43 | 显示全部楼层 |阅读模式

14.4条件编译
条件编译属于预处理程序,包括之前讲的宏,都是程序在编译之前做的一些必要的处理,这些都不是实际程序功能代码,而仅仅是告诉编译器需要进行的特定操作等。
条件编译通常有三种用法,第一种表达式:
    #if  表达式
        程序段 1
    #else  
        程序段 2
    #endif
作用:如果表达式的值为“真”(非0),则编译程序段1,否则,编译程序段2。在使用中,表达式通常是一个常量,事先用宏来进行声明,通过宏声明的值来确定到底执行哪段程序。
比如公司开发了同类的两款产品,这两款产品的功能有一部分是相同的,有一部分是不同的,同样所编写的程序大部分的代码是一样的,只有少部分有区别。这个时候为了方便程序的维护,可以把两款产品的代码写到同一个工程程序中,然后把其中有区别的功能利用条件编译。
    #define  PLAN   0
    #if (PLAN == 0)
        程序段1
    #else
        程序段2
    #endif
这样写之后,当要编译款式1的时候,把PLAN宏声明成0即可,当要编译款式2的时候,把宏声明的值改为1或其它值即可。
第二种表达式和第三种表达式是类似的,使用哪一种要看具体情况或个人偏好。
表达式二:
    #ifdef  标识符
        程序段1
    #else  
        程序段2
    #endif
表达式三:
    #ifndef  标识符
        程序段1
    #else
        程序段2
    #endif
在本章的示例中使用到了表达式三,表达式三的作用是:如果标识符没有被#define命令所声明过,则编译程序段1,否则则编译程序段2。此外,命令中的#else部分是可以省略的。表达式二和表达式三正好相反,实际#ifndef就是if no define的缩写。
在头文件的编写过程中,为了防止命名的错乱,每个.c文件对应的.h文件内的条件编译的命名,也使用这个头文件的名字,并且大写,在中间加上下划线,比如这个main.h的结构,首先要这样写:
#ifndef _MAIN_H    /*本段程序是写在main.h文件中,程序段1为外部变量;外部函数;自定义数据类型等*/
#define _MAIN_H
    程序段1
#endif
这样说明的意思是,如果这个_MAIN_H没有声明过,那么就声明_MAIN_H,并且的程序段1是有效的,最终结束;那么如果_MAIN_H已经声明过了,那么也就不用再声明了,同时程序段1也就无效了。
前边头文件重复包含的问题这样就被解决了,编译器在预编译a.h时进行了#define _MAIN_H,而在预编译b.h时,#ifndef _MAIN_H这一个条件就不成立,也就不会编译b.h当中的这部分内容,这样就有效的解决了头文件重复包含的问题。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表