C/C++ 条件编译完全指南
1. 基本概念
什么是条件编译
条件编译是 C/C++ 预处理器的功能,允许根据宏定义在编译时选择性地包含或排除代码块。不符合条件的代码会在预处理阶段被完全移除,不会参与编译过程。
基本语法
#define MACRO_NAME // 定义宏
#ifdef MACRO_NAME // 如果定义了 MACRO_NAME
// 代码块 A
#else // 否则
// 代码块 B
#endif // 结束条件编译块
编译流程
源代码 → 预处理 → 编译 → 汇编 → 链接 → 可执行文件
.c .i .s .o .exe
↑
条件编译在此阶段工作
2. 预处理器指令详解
2.1 宏定义
#define MACRO_NAME // 定义空宏(开关宏)
#define MACRO_NAME value // 定义带值宏(常量宏)
#define MAX_SIZE 1024 // 数值常量
#define PI 3.14159 // 浮点常量
#define APP_NAME "MyApp" // 字符串常量
2.2 条件 编译指令
#ifdef / #ifndef
#ifdef MACRO_NAME // 如果定义了 MACRO_NAME
// 代码块 A
#endif
#ifndef MACRO_NAME // 如果没有定义 MACRO_NAME
// 代码块 B
#endif
#if / #elif / #else
#if defined(MACRO_A)
// 代码块 A
#elif defined(MACRO_B)
// 代码块 B
#else
// 默认代码块
#endif
复合条件
#if defined(FEATURE_A) && defined(FEATURE_B)
// 两个功能都启用
#elif defined(FEATURE_A) || defined(FEATURE_B)
// 至少一个功能启用
#else
// 都没启用
#endif
2.3 取消宏定义
#undef MACRO_NAME // 取消已定义的宏
3. 实际应用场景
3.1 调试版本控制
#define DEBUG_MODE
#ifdef DEBUG_MODE
#define DBG_PRINT(x) printf("Debug: %s\n", x)
#define ASSERT(x) if(!(x)) { printf("Assert failed: %s\n", #x); exit(1); }
#else
#define DBG_PRINT(x) // 发布版本中为空
#define ASSERT(x) // 发布版本中为空
#endif
int main() {
DBG_PRINT("程序开始执行"); // 只在 DEBUG_MODE 下打印
int x = 10;
ASSERT(x > 5); // 只在 DEBUG_MODE 下检查
return 0;
}
3.2 平台特定代码
#ifdef _WIN32
#include <windows.h>
#define PATH_SEPARATOR '\\'
void clear_screen() { system("cls"); }
#elif defined(__linux__)
#include <unistd.h>
#define PATH_SEPARATOR '/'
void clear_screen() { system("clear"); }
#else
#define PATH_SEPARATOR '/'
void clear_screen() { printf("清屏功能不支持此平台\n"); }
#endif
3.3 功能开关控制
// 编译时功能开关
#define ENABLE_LOGGING
#define ENABLE_CACHE
// #define ENABLE_NETWORK // 注释掉表示禁用网络功能
#ifdef ENABLE_LOGGING
void log_message(const char* msg) {
printf("[LOG] %s\n", msg);
}
#else
void log_message(const char* msg) {
// 空实现,编译器会优化掉
}
#endif
3.4 算法选择
#define USE_OPTIMIZED_SORT // 控制使用哪种算法
void sort_array(int arr[], int size) {
#ifdef USE_OPTIMIZED_SORT
quicksort_optimized(arr, 0, size - 1);
printf("使用优化的快速排序\n");
#else
// 冒泡排序(基础版本)
for(int i = 0; i < size - 1; i++) {
for(int j = 0; j < size - i - 1; j++) {
if(arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
printf("使用基础的冒泡排序\n");
#endif
}
4. 编译控制方法
4.1 代码中控制
#define FEATURE_A // 直接在代码中定义
// #define FEATURE_B // 注释掉表示不启用
4.2 编译器参数控制
# 通过 -D 参数定义宏
gcc -DDEBUG_MODE -DMAX_BUFFER=2048 main.c -o main
# 定义多个宏
gcc -DDEBUG_MODE -DENABLE_LOGGING -DVERSION=2 main.c -o main