来自Deepseek AI的回答:
C++ 中的实用预定义宏
C++ 编译器提供了一系列预定义宏,这些宏在开发过程中非常有用。以下是一些最实用的预定义宏:
1. 标准预定义宏
编译信息相关
__DATE__- 编译日期 ("Mmm dd yyyy" 格式)__TIME__- 编译时间 ("hh:mm:ss" 格式)__TIMESTAMP__- 源文件最后修改的日期和时间__FILE__- 当前源文件名__LINE__- 当前行号__func__- 当前函数名 (C99/C++11)__FUNCTION__- 当前函数名 (非标准但广泛支持)__PRETTY_FUNCTION__- 带完整签名的函数名 (GCC/Clang)
语言标准相关
__cplusplus- C++ 标准版本 (如 199711L, 201103L, 201402L, 201703L, 202002L)__STDC__- 表示遵循 C 标准__STDC_HOSTED__- 1 表示宿主环境,0 表示独立环境__STDC_VERSION__- C 标准版本
2. 编译器识别宏
编译器标识
__GNUC__- GCC 主版本号__GNUC_MINOR__- GCC 次版本号__GNUC_PATCHLEVEL__- GCC 补丁版本号__clang__- Clang 编译器__INTEL_COMPILER- Intel 编译器_MSC_VER- Microsoft Visual C++ 版本__MINGW32__- MinGW 32位__MINGW64__- MinGW 64位
平台相关
__linux__- Linux 平台__APPLE__- Apple 平台__MACH__- Mac OS X_WIN32- Windows 32位或64位_WIN64- Windows 64位__CYGWIN__- Cygwin 环境__FreeBSD__- FreeBSD 系统__ANDROID__- Android 平台__unix__- Unix 系统
3. 功能测试宏
C++11/14/17/20 特性测试
__cpp_constexpr- constexpr 支持__cpp_range_based_for- 范围 for 循环__cpp_lambdas- lambda 表达式__cpp_variadic_templates- 可变参数模板__cpp_rvalue_references- 右值引用__cpp_threadsafe_static_init- 线程安全的静态初始化
4. 实用示例
#include <iostream>
void printCompilerInfo() {
std::cout << "编译信息:\n";
std::cout << "日期: " << __DATE__ << "\n";
std::cout << "时间: " << __TIME__ << "\n";
std::cout << "文件: " << __FILE__ << "\n";
std::cout << "行号: " << __LINE__ << "\n";
std::cout << "函数: " << __func__ << "\n";
std::cout << "C++标准: " << __cplusplus << "\n";
#ifdef __GNUC__
std::cout << "GCC版本: " << __GNUC__ << "."
<< __GNUC_MINOR__ << "."
<< __GNUC_PATCHLEVEL__ << "\n";
#endif
#ifdef __clang__
std::cout << "Clang编译器\n";
#endif
#ifdef _MSC_VER
std::cout << "MSVC版本: " << _MSC_VER << "\n";
#endif
}
int main() {
printCompilerInfo();
return 0;
}5. 实用技巧
- 调试信息:
#define DEBUG_LOG(msg) \
std::cerr << "[" << __FILE__ << ":" << __LINE__ << "] " << msg << std::endl- 平台特定代码:
#ifdef _WIN32
// Windows 特定代码
#elif defined(__linux__)
// Linux 特定代码
#elif defined(__APPLE__)
// macOS 特定代码
#endif- 特性检测:
这些预定义宏在跨平台开发、调试、日志记录和条件编译中非常有用,可以帮助你编写更灵活、更健壮的代码。