在 C 语言中,#if 和 #endif 是预处理指令,用于条件编译。它们的核心作用是:根据预处理器能够识别的条件(通常是宏定义或常量表达式),决定某段代码是否参与编译。
—
基本功能
-  
#if
用于开启一个条件编译块,其后必须是一个常量表达式(可以是宏定义或字面值)。
如果表达式结果为非零值(逻辑“真”),则编译#if和#endif之间的代码;否则直接忽略这段代码。 -  
#endif
标记条件编译块的结束。 
典型用途
-  
根据宏定义选择性编译代码
#define DEBUG 1#if DEBUGprintf("Debug信息: x = %d\n", x); // 只有 DEBUG 非零时,此代码才会被编译 #endif -  
跨平台代码适配
#if defined(_WIN32)// Windows 平台专用代码#include <windows.h> #elif defined(__linux__)// Linux 平台专用代码#include <unistd.h> #endif -  
功能开关控制
#define USE_FEATURE_A 1#if USE_FEATURE_A// 启用功能 A 的代码 #else// 替代功能的代码 #endif 
与其他指令的配合
-  
#elif:类似else if,用于多分支条件:#if OS == 1// ... #elif OS == 2// ... #endif -  
#else:提供备选代码:#if defined(OPTION)// ... #else// ... #endif -  
defined():检查宏是否已定义:#if defined(DEBUG) && (VERSION > 5)// 当 DEBUG 已定义且 VERSION > 5 时编译 #endif 
注意事项
-  
条件必须是预处理器可计算的
表达式中的宏需在之前定义,且只能包含整数常量、字符常量和defined()操作符。 -  
与
#ifdef/#ifndef的区别#ifdef MACRO等价于#if defined(MACRO)#ifndef MACRO等价于#if !defined(MACRO)
 -  
代码被完全排除
如果条件不满足,#if和#endif之间的代码不会进入编译阶段(如同被删除)。 
示例
#include <stdio.h>#define VERSION 3int main() {#if VERSION >= 3printf("高级功能已启用\n"); // VERSION >=3 时编译此代码#elseprintf("基础功能\n");#endifreturn 0;
}
 
当 VERSION 定义为 3 或更高时,输出 高级功能已启用;否则输出 基础功能。
通过 #if 和 #endif,开发者可以灵活控制代码在不同场景下的编译行为,是 C 语言中管理代码兼容性、调试和功能开关的重要工具。