C++ 预处理器
C++ 预处理器(Preprocessor) 是在编译之前对源代码进行处理的工具。预处理器指令通常以 #
开头,不属于 C++ 语言本身,而是由编译器在正式编译之前处理的内容。
🧠 常见的预处理器指令
指令 | 作用 |
---|---|
#include | 包含头文件 |
#define | 定义宏(宏替换) |
#undef | 取消宏定义 |
#ifdef | 如果宏已定义,则编译该部分代码 |
#ifndef | 如果宏未定义,则编译该部分代码 |
#if | 条件编译 |
#elif | 条件编译的“否则如果”部分 |
#else | 条件编译的“否则”部分 |
#endif | 结束条件编译块 |
#pragma | 编译器指令(与具体编译器相关) |
#error | 报错并终止编译 |
#line | 修改编译器认为的当前行号和文件名 |
📌 示例代码
#include
示例
#include <iostream> // 包含标准输入输出库
#include "myheader.h" // 包含用户自定义头文件
#define
和 #ifdef
示例
#define DEBUG
#ifdef DEBUG
#define LOG(x) std::cout << x << std::endl
#else
#define LOG(x)
#endif
int main() {
LOG("调试信息");
}
宏函数示例
#define SQUARE(x) ((x) * (x))
int main() {
int a = 5;
int b = SQUARE(a + 1); // 实际替换为 ((a + 1) * (a + 1))
std::cout << b << std::endl;
}
⚠️ 注意事项
- 宏不是类型安全的,容易出错,建议使用
constexpr
、inline
或const
替代。 - 使用条件编译时注意宏逻辑的完整性,确保
#ifdef
、#else
、#endif
成对匹配。 - 宏展开可能导致副作用,如:
SQUARE(x++)
会出错。
✅ 实际用途
- 头文件保护(防止重复包含):
#ifndef MYHEADER_H
#define MYHEADER_H
// 内容
#endif
- 条件编译以适配不同平台或调试/发布版本。
- 用宏简化重复的代码逻辑(虽然建议适度使用)。
如果你想我帮你具体分析一段预处理器代码,或解释某个复杂宏,也可以贴出来。