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. 注意事项

  1. #elif后面必须有表达式,不能为空
  2. 表达式必须能在编译时求值(常量表达式)
  3. 宏定义最好放在头文件或编译命令中
  4. 注意逻辑优先级,复杂条件用括号
  5. #if 可以处理算术运算,#ifdef 只能检查定义

6. 常见错误

// ❌ 错误
#elif                    // 缺少表达式
#elif VERSION            // 会检查VERSION是否为非0,而不是是否定义

// ✅ 正确
#elif defined(VERSION)   // 检查是否定义
#elif VERSION == 2       // 检查值

这样的条件编译结构可以让你的代码更加灵活和可维护!

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐