【一天一个计算机知识】—— 【编程百度】条件编译


文章目录
- 📥 什么是条件编译?
- 🛠️ 核心指令详解
- 1. `#if`, `#elif`, `#else`, `#endif`
- 2. `#ifdef` 和 `#ifndef`
- 3. `defined()` 操作符
- 📋 综合实例演示
- 示例 1:头文件保护 (`Header Guard`)
- 示例 2:跨平台代码
- 示例 3:临时注释代码 (Debug)
📥 什么是条件编译?
条件编译是C语言(以及C++等)预处理阶段的一项核心功能
它允许您在代码实际被编译之前,根据一组预定义的条件,告诉预处理器“包含”或“排除”哪些代码块
简单来说,它就像是给编译器看的 if-else 语句。
-
运行时
if:程序运行时,根据变量的值决定执行哪条路径。 -
编译时
#if:程序编译时,根据预设的宏或常量决定哪段代码被编译进最终的可执行文件中。
如果条件为假,那部分代码块根本不会被编译,就好像您手动删除了它们一样
🛠️ 核心指令详解
条件编译主要由以下几组预处理器指令控制:
1. #if, #elif, #else, #endif
这是最灵活的条件编译指令,它会计算一个常量表达式的值
-
#if:如果expression(表达式) 为真(非零),则编译后续代码 -
#elif:#elif如果前面的#if或#elif不为真,则检查这个expression -
#else:如果以上所有条件都不为真,则编译这部分代码。 -
#endif:标记条件编译块的结束。
注意: 表达式必须是预处理器在编译时就能计算出来的常量,不能是变量

2. #ifdef 和 #ifndef
这两个指令只检查一个宏(
Macro)是否被定义过,而不关心它的具体值。
-
#ifdef <MACRO_NAME>:(if defined) 如果MACRO_NAME已被定义,则编译后续代码。 -
#ifndef <MACRO_NAME>:(if not defined) 如果MACRO_NAME未被定义,则编译后续代码。
它们通常与 #else 和 #endif 配合使用。

3. defined() 操作符
defined() 是一个特殊的预处理器操作符,它必须在 #if 或 #elif 中使用。它提供了比 #ifdef 更强大的灵活性,因为它允许您在单个表达式中组合多个检查。
defined(MACRO_NAME):如果 MACRO_NAME 被定义,则返回 1 (真);否则返回 0 (假)。

📋 综合实例演示
示例 1:头文件保护 (Header Guard)
这是 string.h(一个假设的自定义头文件)为了防止被重复包含:

-
第一次包含:
_MY_STRING_H_未定义,#ifndef为真。代码执行,_MY_STRING_H_被定义,头文件内容被包含。 -
第二次包含:
_MY_STRING_H_已被定义,#ifndef为假。从#ifndef到#endif之间的所有代码被跳过。
示例 2:跨平台代码

示例 3:临时注释代码 (Debug)

