C/C++条件编译
预处理器根据条件编译指令,有条件地选择源代码中的一部分作为输出,送给编译器进行编译。条件编译指令包含#if
、 #else
、 #elif
、 #ifdef
、 #ifndef
及 #endif
指令。
条件编译预处理块由 #if
、#ifdef
或 #ifndef
指令开始,并可选地包含任意多个 #elif
指令,接下来是至多一个可选的 #else
指令,并以 #endif
指令结束。嵌套的条件编译预处理块会被单独处理。
条件求值
#if, #elif
表达式是常量表达式,仅使用常量
和用 #define
指令定义的标识符。任何非常量,未以 #define 指令定义的标识符,求值为0。
表达式可以含有形式为 defined 标识符
或 defined (标识符)
的一元运算符,若用 #define 指令定义了该 标识符 ,则返回 1 ,否则返回 0 。若 表达式 求值为非零值,则包含该控制代码块并跳过其他。若所用的任何标识符不是常量,则用 0 替换它。
#ifdef, #ifndef
检查是否用 #define
指令定义了标识符。
#ifdef
标识符 本质上等价于 #if defined
标识符 。
#ifndef
标识符 本质上等价于 #if !defined
标识符 。
示例代码
条件编译
#include <iostream>
#define ABCD 2
int main()
{
#ifdef ABCD
std::cout << "1: yes\n";
#else
std::cout << "1: no\n";
#endif
#ifndef ABCD
std::cout << "2: no1\n";
#elif ABCD == 2
std::cout << "2: yes\n";
#else
std::cout << "2: no2\n";
#endif
#if !defined(DCBA) && (ABCD < 2*4-3)
std::cout << "3: yes\n";
#endif
#if ABCD == 1
std::cout << "4: no1\n";
#elif ABCD == 2
std::cout << "4: yes\n";
#else
std::cout << "4: no2\n";
#endif
}
输出
1: yes
2: yes
3: yes
4: yes
debug信息
#include <stdio.h>
#define DEBUG
int main()
{
...
#ifdef DEBUG
printf("this is a debug log\n");
#endif
...
}
头文件保护
// header_file.h
#ifndef _HEADER_FILE_H_
#define _HEADER_FILE_H_
... // 头文件内容
#endif // _HEADER_FILE_H_