C语言多条件编译总结
·
C语言多条件编译总结
1. 基础语法
#if 条件表达式1
// 条件1为真时编译的代码
#elif 条件表达式2
// 条件1为假且条件2为真时编译的代码
#elif 条件表达式3
// 前面条件都假且条件3为真时编译的代码
#else
// 所有条件都为假时编译的代码
#endif
2. 常用方法总结
方法1:使用宏定义切换
// 定义版本号
#define VERSION 2
#if VERSION == 1
// 版本1代码
void func1() { ... }
#elif VERSION == 2
// 版本2代码
void func2() { ... }
#elif VERSION == 3
// 版本3代码
void func3() { ... }
#else
// 默认版本
void func_default() { ... }
#endif
方法2:使用布尔宏
// 定义特性开关
#define FEATURE_A_ENABLED 1
#define FEATURE_B_ENABLED 0
#define DEBUG_MODE 1
#if DEBUG_MODE
printf("Debug info...\n");
#endif
#if FEATURE_A_ENABLED
// 功能A代码
#elif FEATURE_B_ENABLED
// 功能B代码
#endif
方法3:多条件组合
#define MCU_TYPE STC8H
#define CLOCK_SPEED 24
// 复杂条件组合
#if MCU_TYPE == STC8H && CLOCK_SPEED > 20
// 高速STC8H代码
#elif MCU_TYPE == STC15 || MCU_TYPE == STC89
// 其他型号代码
#elif defined(DEBUG) && !defined(RELEASE)
// 调试模式代码
#endif
3. 常用预定义操作符
| 操作符 | 示例 | 说明 |
|---|---|---|
defined() | #if defined(DEBUG) | 检查宏是否已定义 |
! | #if !defined(DEBUG) | 逻辑非 |
&& | #if defined(A) && defined(B) | 逻辑与 |
| ` | ` | |
== | #if VERSION == 2 | 等于 |
!= | #if VERSION != 2 | 不等于 |
> < | #if SIZE > 100 | 比较 |
4. 实用示例
示例1:多平台兼容
// 选择平台
#define PLATFORM_WINDOWS 1
#define PLATFORM_LINUX 2
#define PLATFORM_MAC 3
#define CURRENT_PLATFORM PLATFORM_WINDOWS
#if CURRENT_PLATFORM == PLATFORM_WINDOWS
#include <windows.h>
#define SLEEP(ms) Sleep(ms)
#elif CURRENT_PLATFORM == PLATFORM_LINUX
#include <unistd.h>
#define SLEEP(ms) usleep((ms)*1000)
#elif CURRENT_PLATFORM == PLATFORM_MAC
#include <mach/mach.h>
#define SLEEP(ms) usleep((ms)*1000)
#endif
示例2:调试版本控制
// 定义调试级别
#define DEBUG_NONE 0
#define DEBUG_BASIC 1
#define DEBUG_FULL 2
#define DEBUG_LEVEL DEBUG_FULL
#if DEBUG_LEVEL >= DEBUG_BASIC
#define LOG_BASIC(msg) printf("BASIC: %s\n", msg)
#else
#define LOG_BASIC(msg)
#endif
#if DEBUG_LEVEL >= DEBUG_FULL
#define LOG_FULL(msg) printf("FULL: %s\n", msg)
#else
#define LOG_FULL(msg)
#endif
示例3:条件包含头文件
#if defined(STC8H)
#include <STC8H.H>
#elif defined(STC15)
#include <STC15.H>
#elif defined(STC89)
#include <STC89.H>
#else
#error "MCU type not defined!"
#endif
示例4:功能模块化
#define MODULE_A_ENABLE 1
#define MODULE_B_ENABLE 0
#define MODULE_C_ENABLE 1
#if MODULE_A_ENABLE
void module_a_init() { ... }
void module_a_task() { ... }
#endif
#if MODULE_B_ENABLE
void module_b_init() { ... }
void module_b_task() { ... }
#endif
void main()
{
#if MODULE_A_ENABLE
module_a_init();
#endif
#if MODULE_B_ENABLE
module_b_init();
#endif
while(1)
{
#if MODULE_A_ENABLE
module_a_task();
#endif
#if MODULE_C_ENABLE
// 模块C代码
#endif
}
}
5. 注意事项
#elif后面必须有表达式,不能为空- 表达式必须能在编译时求值(常量表达式)
- 宏定义最好放在头文件或编译命令中
- 注意逻辑优先级,复杂条件用括号
#if可以处理算术运算,#ifdef只能检查定义
6. 常见错误
// ❌ 错误
#elif // 缺少表达式
#elif VERSION // 会检查VERSION是否为非0,而不是是否定义
// ✅ 正确
#elif defined(VERSION) // 检查是否定义
#elif VERSION == 2 // 检查值
这样的条件编译结构可以让你的代码更加灵活和可维护!
更多推荐
所有评论(0)