C++ 参考手册
- C++11
- C++14
- C++17
- C++20
- C++ 编译器支持情况表
- 独立与宿主实现
- C++ 语言
- C++ 关键词
- 预处理器
- 源文件包含
- 条件包含
- 文本替换宏
- 错误指令
- 实现定义的行为控制
- 文件名和行信息
- 注释
- C++ 标准库头文件
- 具名要求
- 功能特性测试 (C++20)
- 工具库
- 类型支持(基本类型、RTTI、类型特性)
- 概念库 (C++20)
- 错误处理
- 动态内存管理
- 日期和时间工具
- 字符串库
- 容器库
- 迭代器库
- 范围库 (C++20)
- 算法库
- 数值库
- 输入/输出库
- 文件系统库
- 本地化库
- 正则表达式库
- 原子操作库
- 线程支持库
- 实验性 C++ 特性
- 有用的资源
- 索引
- std 符号索引
- 协程支持 (C++20)
- C++ 关键词
预处理器
在编译前,于翻译阶段 4 执行预处理器。预处理的结果是单个文件,之后将之传递给实际编译器。
指令
预处理指令控制预处理器的行为。每个指令占据一行并拥有下列格式:
-
#
字符 - 预处理指令(
define
、undef
、include
、if
、ifdef
、ifndef
、else
、elif
、endif
、line
、error
、pragma
之一)[1] - 实参(取决于指令)
- 换行符
允许空指令(后随换行符的 #
),而它没有效果。
导入声明亦为预处理指令。 |
(C++20 起) |
预处理指令必须不来自宏展开。
#define EMPTY EMPTY # include <file.h> // 不是预处理指令
能力
预处理器拥有源文件翻译能力:
- 有条件编译源文件的某些部分(由
#if
、#ifdef
、#ifndef
、#else
、#elif
和#endif
指令控制)。 - 替换文本宏,同时可能对标识符进行拼接或加引号(由
#define
和#undef
指令与#
和##
运算符控制)。 - 包含其他文件(由
#include
指令控制并以__has_include
检查 (C++17 起))。 - 引发错误(由
#error
指令控制)
能控制预处理器的下列方面:
脚注
- ↑ 这些指令是标准定义的。标准不定义其他指令的行为:它们可以被忽略、拥有一些有用的含义或导致编译时错误。即使忽略,也会在预处理器完成工作时将它们从源码中移除。一种常用的非标准扩展是
#warning
指令,它在编译期间放出一条用户定义的消息。