200 编译器的预定义宏
作者Lou Xiao, deepseek创建时间2025-04-02 20:56:21更新时间2025-04-02 20:56:21
1. C++编译器常见预定义宏,涵盖标准宏和部分编译器扩展宏
名称 | 用途 | 原型/定义 | 代码示例 | 注释 |
---|---|---|---|---|
__cplusplus | 标识C++标准版本 | 无参数,展开为版本值 | #if __cplusplus >= 201103L | C++98: 199711L, C++11: 201103L, C++14: 201402L, C++17: 201703L |
__FILE__ | 当前源文件名 | 无参数,展开为字符串字面量 | cout << __FILE__; | 编译时替换为实际文件名(如"main.cpp" ) |
__LINE__ | 当前行号 | 无参数,展开为整数 | cout << __LINE__; | 常用于调试日志 |
__DATE__ | 编译日期(字符串) | 无参数,展开为"MMM DD YYYY" | cout << __DATE__; | 示例:"Jul 20 2023" |
__TIME__ | 编译时间(字符串) | 无参数,展开为"HH:MM:SS" | cout << __TIME__; | 示例:"14:30:00" |
__func__ | 当前函数名(C99/C++11) | 无参数,展开为字符串 | cout << __func__; | 非宏但行为类似宏,返回函数名(如"main" ) |
__VA_ARGS__ | 可变参数宏的占位符 | 用于#define 宏 | #define LOG(...) printf(__VA_ARGS__) | C99/C++11引入的可变参数宏支持 |
__STDC_HOSTED__ | 指示是否在托管环境 | 展开为1(托管)或0(独立) | #if __STDC_HOSTED__ | 托管环境提供完整标准库 |
__has_include | 检查头文件是否存在(C++17) | __has_include(<header>) | #if __has_include(<optional>) | 返回1或0,用于条件编译 |
__GNUC__ | GCC主版本号 | 无参数,展开为整数 | #if __GNUC__ >= 7 | GCC特有宏,如__GNUC__ =7 |
_MSC_VER | MSVC编译器版本 | 无参数,展开为整数 | #if _MSC_VER >= 1920 | VS2019: 1920, VS2022: 1930 |
__clang__ | 标识Clang编译器 | 无参数,展开为1 | #ifdef __clang__ | Clang特有宏 |
__FUNCTION__ | 当前函数名(MSVC/GCC扩展) | 无参数,展开为字符串 | cout << __FUNCTION__; | 类似__func__ 但兼容旧版本 |
__PRETTY_FUNCTION__ | 详细函数签名(GCC/Clang扩展) | 无参数,展开为字符串 | cout << __PRETTY_FUNCTION__; | 包含参数类型和类名(如"int main(int, char**)" ) |
补充说明
标准宏:__cplusplus
、__FILE__
、__LINE__
等由C++标准定义,所有编译器必须支持。
编译器扩展:__GNUC__
、_MSC_VER
等是编译器特有的,使用时需用#ifdef
检查兼容性。
代码示例:
1.双击鼠标左键复制此行;2.单击复制所有代码。
1
#include <iostream>
2
using namespace std;
3
4
int main() {
5
cout << "File: " << __FILE__ << "\n"
6
<< "Line: " << __LINE__ << "\n"
7
<< "C++ Version: " << __cplusplus << endl;
8
return 0;
9
}
条件编译:
1.双击鼠标左键复制此行;2.单击复制所有代码。
1
#if __has_include(<optional>)
2
#include <optional>
3
#endif
2. GCC(GNU Compiler Collection)支持的常见预定义宏的详细整理,包括标准宏、GCC扩展宏以及部分架构相关宏:
名称 | 用途 | 原型/定义 | 代码示例 | 注释 |
---|---|---|---|---|
标准宏(C/C++) | ||||
__FILE__ | 当前源文件名(字符串字面量) | 无参数 | printf("%s", __FILE__); | 同其他编译器 |
__LINE__ | 当前行号(整数) | 无参数 | printf("%d", __LINE__); | |
__DATE__ | 编译日期("MMM DD YYYY" ) | 无参数 | printf("%s", __DATE__); | 示例:"Jul 20 2023" |
__TIME__ | 编译时间("HH:MM:SS" ) | 无参数 | printf("%s", __TIME__); | |
__cplusplus | C++标准版本(如 201103L 表示 C++11) | 无参数 | #if __cplusplus >= 201103L | |
__STDC__ | 是否遵循 ISO C 标准(值为 1 ) | 无参数 | #if __STDC__ | C 模式下有效 |
__STDC_VERSION__ | C 标准版本(如 199901L 表示 C99) | 无参数 | #if __STDC_VERSION__ >= 199901L | C 模式下有效 |
GCC 扩展宏 | ||||
__GNUC__ | GCC 主版本号(如 12 ) | 无参数 | #if __GNUC__ >= 7 | 用于版本检查 |
__GNUC_MINOR__ | GCC 次版本号(如 3 ) | 无参数 | #if __GNUC__ >= 7 && __GNUC_MINOR__ >= 3 | |
__GNUC_PATCHLEVEL__ | GCC 补丁版本号(如 1 ) | 无参数 | printf("%d.%d.%d", __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__); | |
__VERSION__ | GCC 版本字符串(如 "12.3.0" ) | 无参数 | printf("%s", __VERSION__); | |
__FUNCTION__ | 当前函数名(字符串) | 无参数 | printf("%s", __FUNCTION__); | 兼容性宏,类似 __func__ |
__PRETTY_FUNCTION__ | 详细函数签名(含参数类型和类名) | 无参数 | printf("%s", __PRETTY_FUNCTION__); | C++ 中返回 int main(int, char**) ,C 中返回 int main(int, char**) |
__BASE_FILE__ | 主源文件名(如编译多个文件时) | 无参数 | printf("%s", __BASE_FILE__); | |
__INCLUDE_LEVEL__ | 头文件嵌套深度(从 0 开始) | 无参数 | #if __INCLUDE_LEVEL__ > 1 | |
__OPTIMIZE__ | 是否启用优化(-O1 /-O2 等时定义为 1 ) | 无参数 | #if __OPTIMIZE__ | |
__OPTIMIZE_SIZE__ | 是否优化代码大小(-Os 时定义为 1 ) | 无参数 | #if __OPTIMIZE_SIZE__ | |
__NO_INLINE__ | 是否禁用内联(-fno-inline 时定义为 1 ) | 无参数 | #if __NO_INLINE__ | |
__CHAR_UNSIGNED__ | 是否将 char 视为无符号类型(-funsigned-char 时定义为 1 ) | 无参数 | #if __CHAR_UNSIGNED__ | |
__DEPRECATED | 标记代码为已弃用(编译器警告) | 无参数 | __DEPRECATED int foo(); | |
__attribute__((...)) | 指定函数/变量属性(如对齐、优化控制) | 非宏,但行为类似 | __attribute__((aligned(16))) int x; | 支持 aligned 、noreturn 、weak 等属性 |
架构相关宏 | ||||
__x86_64__ | 是否为 x86-64 架构 | 无参数 | #ifdef __x86_64__ | |
__i386__ | 是否为 x86 架构(32 位) | 无参数 | #ifdef __i386__ | |
__ARM_ARCH | ARM 架构版本(如 7 表示 ARMv7) | 无参数 | #if __ARM_ARCH >= 7 | |
__aarch64__ | 是否为 ARM64 架构 | 无参数 | #ifdef __aarch64__ | |
__BYTE_ORDER__ | 字节序(__ORDER_LITTLE_ENDIAN__ 或 __ORDER_BIG_ENDIAN__ ) | 无参数 | #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ | |
__SIZEOF_INT__ | int 类型的字节数(如 4 ) | 无参数 | printf("%zu", __SIZEOF_INT__); | |
操作系统宏 | ||||
__linux__ | 是否为 Linux 系统 | 无参数 | #ifdef __linux__ | |
__unix__ | 是否为 UNIX 系统 | 无参数 | #ifdef __unix__ | |
__WIN32__ | 是否为 Windows 系统 | 无参数 | #ifdef __WIN32__ | |
__APPLE__ | 是否为 Apple 平台(macOS/iOS) | 无参数 | #ifdef __APPLE__ |
代码示例
1.双击鼠标左键复制此行;2.单击复制所有代码。
1
#include <stdio.h>
2
3
int main() {
4
printf("GCC Version: %s\n", __VERSION__);
5
printf("Function: %s\n", __PRETTY_FUNCTION__);
6
printf("File: %s (Line: %d)\n", __FILE__, __LINE__);
7
8
#ifdef __x86_64__
9
printf("Arch: x86-64\n");
10
#endif
11
12
return 0;
13
}
注释说明
- 版本检查:
cpp #if __GNUC__ >= 10 // 使用 GCC 10+ 特性 #endif
- 条件编译:
cpp #if defined(__linux__) && defined(__x86_64__) // Linux x86-64 专用代码 #endif
- 属性扩展:
cpp __attribute__((noreturn)) void fatal_error() { fprintf(stderr, "Error!\n"); exit(1); }
3. clang支持的扩展宏、架构宏、操作系统宏
以下是 Clang 编译器 支持的扩展宏、架构宏和操作系统宏的详细整理,包括与 GCC 兼容的宏和 Clang 特有的宏:
Clang 预定义宏整理表
类别 | 名称 | 用途 | 代码示例 | 注释 |
---|---|---|---|---|
扩展宏 | ||||
__clang__ | 标识 Clang 编译器 | #ifdef __clang__ | Clang 特有宏 | |
__clang_major__ | Clang 主版本号(如 17 ) | #if __clang_major__ >= 15 | ||
__clang_minor__ | Clang 次版本号(如 0 ) | printf("%d.%d", __clang_major__, __clang_minor__); | ||
__clang_patchlevel__ | Clang 补丁版本号(如 1 ) | #if __clang_patchlevel__ > 0 | ||
__clang_version__ | Clang 版本字符串(如 "17.0.1" ) | printf("%s", __clang_version__); | ||
__has_feature(x) | 检查语言/编译器特性支持 | #if __has_feature(cxx_rtti) | 检测 RTTI、模块等特性 | |
__has_extension(x) | 检查扩展特性支持 | #if __has_extension(blocks) | 检测 Blocks(Objective-C)等 | |
__has_attribute(x) | 检查属性支持 | #if __has_attribute(always_inline) | 类似 GCC 的 __attribute__ | |
__has_builtin(x) | 检查内建函数支持 | #if __has_builtin(__builtin_assume_aligned) | ||
__has_include(x) | 检查头文件是否存在(C++17) | #if __has_include(<optional>) | ||
__is_identifier(x) | 检查是否为合法标识符 | #if __is_identifier(123) | 返回 0 或 1 | |
__builtin_available | 检查系统 API 可用性 | if (__builtin_available(iOS 11, *)) { ... } | macOS/iOS 平台专用 | |
__PRETTY_FUNCTION__ | 详细函数签名(同 GCC) | printf("%s", __PRETTY_FUNCTION__); | 返回包含参数类型的字符串 | |
架构宏 | ||||
__x86_64__ | x86-64 架构 | #ifdef __x86_64__ | 同 GCC | |
__i386__ | x86 架构(32 位) | #ifdef __i386__ | ||
__arm__ | ARM 架构 | #ifdef __arm__ | ||
__aarch64__ | ARM64 架构 | #ifdef __aarch64__ | ||
__mips__ | MIPS 架构 | #ifdef __mips__ | ||
__powerpc__ | PowerPC 架构 | #ifdef __powerpc__ | ||
__riscv | RISC-V 架构 | #ifdef __riscv | ||
__BYTE_ORDER__ | 字节序(同 GCC) | #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ | ||
__LP64__ | 是否为 64 位长指针模型 | #ifdef __LP64__ | 在 64 位系统中通常定义为 1 | |
操作系统宏 | ||||
__APPLE__ | Apple 平台(macOS/iOS) | #ifdef __APPLE__ | ||
__linux__ | Linux 系统 | #ifdef __linux__ | 同 GCC | |
__unix__ | UNIX 系统 | #ifdef __unix__ | ||
__FreeBSD__ | FreeBSD 系统 | #ifdef __FreeBSD__ | ||
__ANDROID__ | Android 平台 | #ifdef __ANDROID__ | ||
__WIN32__ | Windows 系统(32/64 位) | #ifdef __WIN32__ | ||
_WIN64 | Windows 64 位系统 | #ifdef _WIN64 | ||
__CYGWIN__ | Cygwin 环境 | #ifdef __CYGWIN__ | ||
__OpenBSD__ | OpenBSD 系统 | #ifdef __OpenBSD__ | ||
TARGET_OS_IPHONE | iOS 平台 | #if TARGET_OS_IPHONE | Apple 特有 | |
TARGET_OS_MAC | macOS 平台 | #if TARGET_OS_MAC |
代码示例
1.双击鼠标左键复制此行;2.单击复制所有代码。
1
#include <stdio.h>
2
3
int main() {
4
printf("Clang Version: %s\n", __clang_version__);
5
printf("Function: %s\n", __PRETTY_FUNCTION__);
6
7
#ifdef __APPLE__
8
printf("Running on Apple platform\n");
9
#endif
10
11
#if __has_feature(cxx_rtti)
12
printf("RTTI is supported\n");
13
#endif
14
15
return 0;
16
}
注释说明
- 版本检查:
cpp #if __clang_major__ >= 15 // 使用 Clang 15+ 特性 #endif
- 特性检测:
cpp #if __has_feature(modules) @import Foundation; // Objective-C 模块支持 #endif
- 平台适配:
cpp #if defined(__linux__) && defined(__x86_64__) // Linux x86-64 专用代码 #elif defined(__APPLE__) // Apple 平台代码 #endif
Clang 特有功能
- 模块支持:
cpp #if __has_feature(modules) @import std.io; // C++ 模块(实验性) #endif
- Objective-C 扩展:
cpp #if __has_feature(objc_arc) // ARC(自动引用计数)已启用 #endif
4. MSVC(Microsoft Visual C++) 支持的扩展宏、架构宏和操作系统宏的详细整理,包括与标准兼容的宏和 MSVC 特有的宏
以下是 MSVC(Microsoft Visual C++) 支持的扩展宏、架构宏和操作系统宏的详细整理,包括与标准兼容的宏和 MSVC 特有的宏:
MSVC 预定义宏整理表
类别 | 名称 | 用途 | 代码示例 | 注释 |
---|---|---|---|---|
扩展宏 | ||||
_MSC_VER | MSVC 编译器版本(如 1930 表示 VS2022) | #if _MSC_VER >= 1930 | VS2022: 1930, VS2019: 1920 | |
_MSC_FULL_VER | 完整版本号(如 193030704 ) | printf("%d", _MSC_FULL_VER); | 包含补丁号 | |
_MSC_BUILD | 编译器构建号 | #if _MSC_BUILD > 1000 | ||
_MSVC_LANG | 支持的 C++ 标准版本(如 201703L ) | #if _MSVC_LANG >= 201703L | 类似 __cplusplus ,但更准确 | |
__cplusplus | C++ 标准版本(需启用 /Zc:__cplusplus ) | #if __cplusplus >= 201703L | 默认不准确,需手动启用 | |
_CHAR_UNSIGNED | char 是否为无符号类型 | #ifdef _CHAR_UNSIGNED | 默认在 ARM 中为 1 | |
_CPPRTTI | 是否启用 RTTI(/GR 时定义) | #ifdef _CPPRTTI | ||
_CPPUNWIND | 是否启用异常处理(/EHsc 时定义) | #ifdef _CPPUNWIND | ||
_DEBUG | 是否为调试模式(/MDd //MTd 时定义) | #ifdef _DEBUG | ||
_DLL | 是否使用动态运行时库(/MD 时定义) | #ifdef _DLL | ||
_WIN32 | 是否为 32/64 位 Windows | #ifdef _WIN32 | 32/64 位均定义 | |
_WIN64 | 是否为 64 位 Windows | #ifdef _WIN64 | ||
_M_IX86 | x86 架构(32 位) | #ifdef _M_IX86 | ||
_M_X64 | x64 架构 | #ifdef _M_X64 | ||
_M_ARM | ARM 架构(32 位) | #ifdef _M_ARM | ||
_M_ARM64 | ARM64 架构 | #ifdef _M_ARM64 | ||
_M_PPC | PowerPC 架构(已弃用) | #ifdef _M_PPC | ||
_ATL_VER | ATL 库版本 | #if _ATL_VER >= 0x0E00 | ||
_MFC_VER | MFC 库版本 | #if _MFC_VER >= 0x0E00 | ||
__FUNCDNAME__ | 修饰后的函数名(用于链接) | printf("%s", __FUNCDNAME__); | 返回 ?main@@YAHH@Z 类似格式 | |
__FUNCSIG__ | 完整函数签名(含调用约定) | printf("%s", __FUNCSIG__); | 返回 int __cdecl main(int) | |
__FUNCTION__ | 当前函数名(无修饰) | printf("%s", __FUNCTION__); | 类似 __func__ | |
__pragma | 编译器指令(类似 #pragma ) | __pragma(warning(disable: 4996)) | 动态禁用警告 | |
_HAS_CXX17 | 是否启用 C++17 特性 | #if _HAS_CXX17 | 需配合 /std:c++17 | |
_HAS_EXCEPTIONS | 是否启用异常处理(默认 1 ) | #if _HAS_EXCEPTIONS | ||
操作系统宏 | ||||
_WIN32_WINNT | Windows 目标版本(如 0x0A00 表示 Win10) | #if _WIN32_WINNT >= 0x0A00 | 需在 <sdkddkver.h> 中定义 | |
NTDDI_VERSION | Windows SDK 版本 | #if NTDDI_VERSION >= NTDDI_WIN10 | ||
WINAPI_FAMILY | Windows 应用类型(如 WINAPI_FAMILY_DESKTOP_APP ) | #if WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP | 用于 UWP/Desktop 区分 | |
_CONSOLE | 是否为控制台程序 | #ifdef _CONSOLE | ||
_WINDOWS | 是否为 GUI 程序 | #ifdef _WINDOWS | ||
_USRDLL | 是否为用户模式 DLL | #ifdef _USRDLL |
代码示例
1.双击鼠标左键复制此行;2.单击复制所有代码。
1
#include <stdio.h>
2
#include <windows.h>
3
4
int main() {
5
printf("MSVC Version: %d\n", _MSC_VER);
6
printf("Function: %s\n", __FUNCTION__);
7
printf("Signature: %s\n", __FUNCSIG__);
8
9
#ifdef _M_X64
10
printf("Arch: x64\n");
11
#endif
12
13
#if _WIN32_WINNT >= 0x0A00
14
printf("Target: Windows 10+\n");
15
#endif
16
17
return 0;
18
}
注释说明
- 版本检查:
cpp #if _MSC_VER >= 1930 // 使用 VS2022+ 特性 #endif
- 平台适配:
cpp #if defined(_M_IX86) // x86 专用代码 #elif defined(_M_X64) // x64 专用代码 #endif
- Windows 版本控制:
cpp #include <sdkddkver.h> #if _WIN32_WINNT >= 0x0A00 // Windows 10+ API SetThreadDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2); #endif
MSVC 特有功能
- 调用约定标记:
cpp void __stdcall foo(); // 通过宏标记调用约定
- 动态禁用警告:
cpp __pragma(warning(push)) __pragma(warning(disable: 4996)) printf("%s", strerror(errno)); // 忽略不安全函数警告 __pragma(warning(pop))