《学习C++》基本概念之预定义宏(c 预定义)
在每一个TU中,有一些宏名已被预先定义好,称为预定义宏(Predefined Macro)。这些宏如果出现在代码中,将在预编译阶段展开。
__cplusplus
展开为一个整型常量值,用于表示当前使用的C++标准的版本号。如果未定义,则代表当前为C语言编译环境。
__cplusplus值 | 对应的C++版本 |
199711L | C++98 C++03 |
201103L | C++11 |
201402L | C++14 |
201703L | C++17 |
202002L | C++20 |
202302L | C++23 |
结合条件编译,可以根据当前的C++版本选择不同的代码执行,用于编写跨版本、跨语言兼容代码。
- 以下代码可以同时支持C/C++编译,即一套代码可同时为两种语言提供接口声明。
#ifdef __cplusplus
extern "C" { // 告诉 C++ 编译器以 C 方式链接
#endif
// 兼容 C 的代码(如头文件声明)
#ifdef __cplusplus
}
#endif
- 以下代码根据C++版本,选择不同的头文件。
#if __cplusplus >= 201703L
// C++17 或更高版本的代码
#include <filesystem>
namespace fs = std::filesystem;
#elif __cplusplus >= 201103L
// C++11/C++14 的备用代码
#include <experimental/filesystem>
namespace fs = std::experimental::filesystem;
#else
#error "This code requires C++11 or later!"
#endif
__FILE__、__LINE__、__DATE__、__TIME__
分别展开为当前文件名(字符串常量)、当前代码行号(整型常量)、当前编译日期(字符串常量,格式为“Mmm dd yyyy”)、当前编译时间(字符串常量,格式为“hh:mm:ss”)。
这些宏主要用于错误日志输出,有助于调试定位。
__STDC_HOSTED__
C++11引入的预定义宏,展开为整数常量,表示C++的运行环境。1表示托管环境(hosted),即运行在操作系统之上,可以使用标准库;0表示独立环境(freestanding),即无操作系统的环境(如嵌入式系统、内核开发等),通常只能使用语言核心功能,标准库支持有限。
结合条件编译,可以使一套代码同时支持普通操作系统环境以及嵌入式(或内核)环境。
#if !__STDC_HOSTED__
// 独立环境下必须自行实现基本函数
void* memcpy(void* dest, const void* src, size_t n) {
char* d = (char*)dest;
const char* s = (const char*)src;
while (n--) *d++ = *s++;
return dest;
}
#else
#include <string.h> // 使用标准库的 memcpy
#endif