专业网站建设品牌,十四年专业建站经验,服务6000+客户--广州京杭网络
免费热线:400-683-0016      微信咨询  |  联系我们

C语言条件编译(#if,#ifdef,#ifndef,#endif,#else,#elif)

当前位置:网站建设 > 技术支持
资料来源:网络整理       时间:2023/2/17 11:52:49       共计:3601 浏览
条件编译(conditional compiling)命令指定预处理器依据特定的条件来判断保留或删除某段源代码。例如,可以使用条件编译让源代码适用于不同的目标系统,而不需要管理该源代码的各种不同版本。

条件编译区域以 #if、#ifdef 或 #ifndef 等命令作为开头,以 #endif 命令结尾。条件编译区域可以有任意数量的 #elif 命令,但最多一个 #else 命令。以 #if 开头的条件编译区域具有下面的格式:
#if 表达式1
  [ 组1]
[#elif 表达式2
  [ 组2]]
...
[#elif 表达式n
  [ 组n ]]
[#else
  [ 组n+1 ]]
#endif

预处理器会依次计算条件表达式,直到发现结果非 0(也就是 true)的条件表达式。预处理器会保留对应组内的源代码,以供后续处理。如果找不到值为 true 的表达式,并且该条件式编译区域中包含 #else 命令,则保留 #else 命令组内的代码。

组 1、组 2 等代码段,可以包含任意 C 源代码,也可以包含更多的命令,包括嵌套的条件式编译命令。在预处理阶段结束时,没有被预处理器保留以用于后续处理的组会从程序中全部删除。

#if 和 #elif 命令

作为 #if 或 #elif 命令条件的表达式,必须是整数常量预处理器表达式。这与普通的整数常量表达式不同,主要区别在于:

(1) 不能在 #if 或 #elif 表达式中使用类型转换运算符。

(2) 可以使用预处理运算符 defined。

(3) 在预处理器展开所有宏,并且计算完所有 defined 表达式之后,会使用字符 o 替换掉表达式中所有其他标识符或关键字。

(4) 表达式中所有带符号值都具有 intmax_t 类型,并且所有无符号值都具有 uintmax_t 类型。字符常量也会受该规则的影响。intmax_t 和 uintmax_t 定义在头文件 stdint.h 中。

(5) 预处理器会把字符常量和字符串字面量中的字符与转义序列转换成运行字符集中对应的字符。然而,字符常量在预处理器表达式和在后期编译阶段是否具有相同的值,取决于实现版本。

defined 运算符

一元运算符 defined 可以出现在 #if 或 #elif 命令的条件中。它的形式如下:
defined 标识符
defined (标识符)

如果指定的  identifier 是一个宏名称(也就是说,它已被 #define 命令定义,并且未被 #undef 命令取消定义),则 defined 表达式会生成值 1。否则,defined 表达式会生成值 0。

defined 运算符相对于 #ifdef 和 #ifndef 命令的优点是:你可以在更大型的预处理器表达式中使用它的值。如下例所示:
#if defined( __unix__ ) && defined( __GNUC__ )
/* ... */
#endif

大多数编译器会提供预定义宏,例如上例所使用的宏,它用来识别目标系统和编译器。因此,在 Unix 系统中,通常预先定义好了宏 __unix__,而 GCC 编译器则会预先定义好了宏 __GNUC__。类似地,微软 Windows 平台上的 Visual C 编译器会自动定义好宏 _WIN32 和宏 _MSC_VER。

#ifdef 和 #ifndef 命令

可以通过 #ifdef 和 #ifndef 命令测试某个宏是否已被定义。它们的语法是:
#ifdef 标识符
#ifndef 标识符

这等同于下面的 #if 命令:
#if defined 标识符
#if !defined 标识符

如果 identifier 不是宏名称,则 #ifndef 标识符后面的条件代码被保留。
版权说明:
本网站凡注明“广州京杭 原创”的皆为本站原创文章,如需转载请注明出处!
本网转载皆注明出处,遵循行业规范,如发现作品内容版权或其它问题的,请与我们联系处理!
欢迎扫描右侧微信二维码与我们联系。
·上一条:什么是编译器? | ·下一条:C++ forward_list用法详解

Copyright © 广州京杭网络科技有限公司 2005-2024 版权所有    粤ICP备16019765号 

广州京杭网络科技有限公司 版权所有