网站首页 > 文章精选 正文
条件编译
C语言提供了条件编译的语法,就是在编译源码的时候,可以选择性地编译指定的代码。例如我们开发一个兼容windows系统和linux系统运行的项目,那么,一些与操作系统密切相关的代码,就需要进行选择性编译。
那么,我们学习了if条件判断语句,我们可以想到如下的思路:
int comple_w = 1; //1值为编译windows代码,0值为编译linux代码;
if(1 == comple_w)
{
编译windows代码;
}
else
{
编译linux代码;
}
那么,上面的逻辑思路,可以使用C语言提供的条件编译语法来实现。首先,我们来看看C语言提供的条件编译语法,有:
(1) #ifdef - #endif语句,使用格式如下:
#ifdef 标识符
程序代码A
#endif
关键字#ifdef 判断后面接的“标识符”是否为一个宏,如果是使用#define关键字来定义的一个宏,则编译程序代码A。如果“标识符”不是一个宏,则不会编译程序代码A。#ifdef关键字使用#endif关键字来结束。
(2) #ifdef - #else - #endif语句,使用格式如下:
#ifdef 标识符
程序代码A
#else
程序代码B
#endif
关键字#ifdef配合#else使用,那么,如果“标识符”是定义的宏时,则编译程序代码A;如果“标识符”不是定义的宏时,则编译程序代码B。
(3) #ifndef - #endif 语句,使用格式如下:
#ifndef 标识符
程序代码A
#endif
当标识符“不是”一个定义的宏时,则编译程序代码A;否则,不编译程序代码A。
(4) #ifndef - #else - #endif 语句,使用格式如下:
#ifndef 标识符
程序代码A
#else
程序代码B
#endif
当标识符“不是”一个定义的宏时,则编译程序代码A;否则,编译程序代码B。
(5) #if - #endif语句,使用格式如下:
#if 标识符
程序代码A
#endif
关键字#if判断标识符的值为真或假,如果是真,则编译程序代码A;如果是假,则不编译,对于“真”和“假”的定义,C语言把0值定义为假,把非0值定义为真。
(6) #if - #else - #endif语句,使用格式如下:
#if 标识符
程序代码A
#else
程序代码B
#endif
关键字#if配合#else使用,判断标识符的值为真或假,如果是真,则编译程序代码A;如果是假,则编译程序代码B;
程序测试例子如下:
程序运行结果如下:
可以看到,我们定义了ABC宏,那么,#ifdef ABC判断为真;没有定义WWW宏,所以,#ifndef WWW判断为真。
定义AAA的值为1,所以,#if AAA判断为真。对于#if关键字,可以直接使用如下:
#if 0
... //不编译的代码;
#endif
#if 1
... //总是编译的代码;
#endif
所以,我们可以使用#if灵活控制那些代码可以编译和屏蔽。
总结
本章节我们学习了C语言预处理知识,可以使用#define指令来定义宏,使用#ifdef等指令来判断一个宏释放定义,然后,选择性地编译代码。
通过预编译指令,我们可以灵活地配置代码,不同的系统,编译不同的代码。让软件代码可以在不同系统平台上运行移植,提高系统的可移植性。
读者要仔细分析,掌握好每一个知识点,然后,自己总结出对该知识点的理解。自己总结出来的知识,理解才深刻,才是自己掌握的知识。
猜你喜欢
- 2025-07-06 C语言精华:宏与预处理器技巧深度解析
- 2025-07-06 一文读懂C程序的编译过程(c 程序如何编译)
- 2025-07-06 C/C++ 自定义头文件,及头文件结构详解
- 2025-07-06 C#项目中引用不同版本的DLL(c# 引用c++的dll .h)
- 2025-07-06 20个最经典的C语言问答题,建议关注加收藏
- 2025-07-06 这些C++工程师面试题你都会了吗?(c/c++工程师面试会怎么问)
- 2025-07-06 C语言翻译环境:预编译+编译+汇编+链接详解
- 2025-07-06 VBA实现Excel无边框登录界面以及安全验证与用户交互设计
- 2025-07-06 C++基础知识总结(超详细总结)(c++ 基础知识)
- 2025-07-06 C++开发:源码编译过程(c++11源码)
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)
- mysql数据库面试题 (57)