C++ 预处理器概述
C++ 预处理器是编译过程中的一个独立阶段,负责在代码被编译器处理前执行文本替换和文件操作。它不分析 C++ 语法,而是直接处理以 # 开头的指令。
主要预处理指令
#include 用于将其他文件的内容插入到当前文件中。常见形式:
cpp
#include <iostream> // 标准库头文件
#include "myheader.h" // 用户自定义头文件
#define 用于定义宏。宏可以是对象宏或函数宏:
cpp
#define PI 3.14159
#define MAX(a,b) ((a) > (b) ? (a) : (b))
条件编译指令 允许根据条件选择性地包含代码:
cpp
#ifdef DEBUG
// 调试专用代码
#endif
#if __cplusplus >= 201103L
// C++11及以上版本代码
#endif
#pragma 编译器特定的指令,如:
cpp
#pragma once // 防止头文件重复包含
预定义宏
C++ 提供了一些内置宏:
cpp
__LINE__ // 当前行号
__FILE__ // 文件名
__DATE__ // 编译日期
__TIME__ // 编译时间
__cplusplus // C++标准版本
注意事项
宏展开是纯文本替换,可能导致意外行为:
cpp
#define SQUARE(x) x*x
SQUARE(1+1) // 展开为 1+1*1+1 = 3 而非预期的4
应使用括号确保正确性:
cpp
#define SQUARE(x) ((x)*(x))
现代C++替代方案
C++11 后推荐使用以下替代方案:
- 常量:
constexpr替代对象宏 - 内联函数:替代函数宏
- 静态断言:
static_assert替代部分编译时检查 - 模块(C++20):逐步替代头文件包含机制