首页 > 编程笔记

C++条件编译详解

编程过程中,有时你需要根据不同的条件来决定哪些代码段需要编译,C++提供了条件编译的功能,它主要通过 #if、#elif、#else、#endif、#ifdef、#ifndef 这些预处理器指令来实现。

所谓条件编译,就是可以将源文件中的代码分成几个部分,有选择地编译各个部分。

#if、#elif、#else和#endif

对于前三个宏 #if,#elif 和 #else,可以理解为 if,else if 和 else;#endif 表示这个条件编译的结束,语法格式如下:
#if 整型常量表达式1
    程序段1
#elif 整型常量表达式2
    程序段2
#elif 整型常量表达式3
    程序段3
#else
    程序段4
#endif
分析下面的程序:
#include <iostream>

#define NUMBER 5
int main()
{
#if NUMBER == 10
    std::cout << "Number is equal to 10." << std::endl;
#elif NUMBER == 5
    std::cout << "Number is equal to 5." << std::endl;
#else
    std::cout << "Others." << std::endl;
#endif
    return 0;
}
程序的第 3 行定义 NUMBER 宏,令其等于 5。后面的代码判断是否等于相应的值,选择性地编译后面的语句,由于定义 NUMBER 等于 5,编译器输出“Number is equal to 5”。

defined()运算符

在 #if 和 #elif 指令中,可以使用 defined() 运算符来检查某个宏是否已经被定义。

举个简单的例子:
#if defined(DEBUG) && !defined(RELEASE)
  // 仅当DEBUG被定义并且RELEASE没有被定义时编译
#endif

#ifdef和#ifndef

使用 #ifdef 和 #ifndef 也能实现条件编译,这两个命令也用 #endif 作为作用域的结束。语法格式如下:
#ifdef  宏名   // #ifndef 宏名
    程序段1
#else
    程序段2
#endif
#ifdef 判断后面的宏是否已经定义,#ifndef 判断后面的宏是否未定义,它们的含义正好相反。

分析下面的程序:
#include <iostream>

#define NUMBER

int main()
{
#ifdef NUMBER
    std::cout << "NUMBER is defined." << std::endl;
#else
    std::cout << "NUMBER is not defined." << std::endl;
#endif
    return 0;
}
第 7 行判断是否定义 DEBUG 宏,由于它已经在第 3 行定义了,所以执行第一个 cout 语句,输出结果为:

NUMBER is defined.

总结

条件编译是 C++ 中一个强大但需要谨慎使用的功能。它主要通过预处理器指令来实现,用于在编译时根据不同的条件来选择性地编译代码。

注意,#if 后面跟的是“整型常量表达式”,而 #ifdef 和 #ifndef 后面跟的只能是一个宏名,不能是其它的。

推荐阅读