C++ #if

在 C++ 中,#if预处理器指令 (Preprocessor Directive),用于 条件编译 ,即在编译阶段根据条件决定是否包含某段代码。它通常与 #define#ifdef#ifndef#else#endif 配合使用。


基本语法

cpp 复制代码
#if 条件表达式
    // 如果条件为真,编译这部分代码
#else
    // 如果条件为假,编译这部分代码
#endif
  • 条件表达式 必须是 常量表达式(编译时可确定的值)。

  • 如果条件成立(非零),则编译 #if#else/#endif 之间的代码;否则跳过。


常见用法

1. 检查宏是否定义

cpp 复制代码
#define DEBUG 1  // 定义 DEBUG 宏

#if DEBUG
    std::cout << "Debug mode is ON\n";
#else
    std::cout << "Debug mode is OFF\n";
#endif
  • 如果 DEBUG 被定义且非零,则输出 "Debug mode is ON"

2. 与 #ifdef#ifndef 结合

指令 作用
#ifdef 宏 如果宏已定义,则编译后续代码
#ifndef 宏 如果宏未定义,则编译后续代码

示例:防止头文件重复包含

cpp 复制代码
#ifndef MY_HEADER_H  // 如果 MY_HEADER_H 未定义
#define MY_HEADER_H  // 定义它,避免重复包含

// 头文件内容
class MyClass { /* ... */ };

#endif  // 结束条件编译

3. 多条件判断(#elif

cpp 复制代码
#define VERSION 2

#if VERSION == 1
    std::cout << "Running version 1\n";
#elif VERSION == 2
    std::cout << "Running version 2\n";  // 会执行这里
#else
    std::cout << "Unknown version\n";
#endif

4. 检查编译器或平台

cpp 复制代码
#if defined(__linux__)
    std::cout << "Running on Linux\n";
#elif defined(_WIN32)
    std::cout << "Running on Windows\n";
#elif defined(__APPLE__)
    std::cout << "Running on macOS\n";
#endif

#if vs if

特性 #if (预处理器) if (运行时条件)
执行阶段 编译时(代码是否包含) 运行时(决定执行哪段代码)
条件类型 必须是宏或常量表达式(如 1+1 可以是变量或动态表达式
用途 条件编译、跨平台适配 程序逻辑控制

示例对比

cpp 复制代码
// #if (编译时决定)
#define USE_OPTIMIZATION 1
#if USE_OPTIMIZATION
    optimize_algorithm();  // 编译时会包含
#endif

// if (运行时决定)
bool use_optimization = true;
if (use_optimization) {
    optimize_algorithm();  // 运行时决定是否执行
}

注意事项

  1. #if 不能检查变量的值(必须是宏或常量):

    cpp 复制代码
    int x = 10;
    #if x > 5  // 错误!x 不是编译时常量
    #endif
  2. #if 可以嵌套

    cpp 复制代码
    #if COND1
        #if COND2
            // ...
        #endif
    #endif
  3. #if 0 用于注释大段代码

    cpp 复制代码
    #if 0
        // 这段代码不会编译(相当于注释)
        deprecated_function();
    #endif

总结

  • #if 是预处理器指令 ,用于 条件编译(决定哪些代码参与编译)。

  • 常用场景

    • 调试开关(DEBUG 模式)

    • 跨平台适配(Windows/Linux/macOS)

    • 防止头文件重复包含(#ifndef + #define

  • if 的区别#if 在编译时处理,if 在运行时处理。

相关推荐
王维同学1 小时前
Winsock 协议与名称空间 Provider 目录
网络·c++·windows·安全
拳里剑气3 小时前
C++算法:BFS解决FloodFill算法
c++·算法·bfs·宽度优先
爱写代码的小朋友3 小时前
从零开始学 Win32 API:C++ 窗口编程实战(VS Code + MinGW-w64 命令行详解)
开发语言·c++
小小晓.3 小时前
C++:语句和作用域
开发语言·c++
fqbqrr3 小时前
2607C++,soui,xplayer视频播放器
c++·soui
zh路西法5 小时前
【10天速通ROS2-PX4无人机】(四) 关掉GPS和气压计,纯激光定位还能飞吗
c++·无人机·px4·ros2·卡尔曼滤波·fastlio2
yyds_yyd_100865 小时前
1464. 数组中两元素的最大乘积(2026.07.27)
数据结构·c++·算法·leetcode
王老师青少年编程7 小时前
csp信奥赛C++高频考点专项训练:【排序算法】案例7:最高分数的学生姓名
c++·排序算法·csp·高频考点·信奥赛·最高分数的学生姓名
库克克8 小时前
【C++】set 与multiset
开发语言·c++
Mortalbreeze8 小时前
深入 Linux Socket 编程:端口号、网络字节序与 struct sockaddr 详解
linux·服务器·网络·c++