200 编译器的预定义宏


作者Lou Xiao, deepseek创建时间2025-04-02 20:56:21更新时间2025-04-02 20:56:21

1. C++编译器常见预定义宏,涵盖标准宏和部分编译器扩展宏

名称用途原型/定义代码示例注释
__cplusplus标识C++标准版本无参数,展开为版本值#if __cplusplus >= 201103LC++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__ >= 7GCC特有宏,如__GNUC__=7
_MSC_VERMSVC编译器版本无参数,展开为整数#if _MSC_VER >= 1920VS2019: 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__);
__cplusplusC++标准版本(如 201103L 表示 C++11)无参数#if __cplusplus >= 201103L
__STDC__是否遵循 ISO C 标准(值为 1无参数#if __STDC__C 模式下有效
__STDC_VERSION__C 标准版本(如 199901L 表示 C99)无参数#if __STDC_VERSION__ >= 199901LC 模式下有效
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;支持 alignednoreturnweak 等属性
架构相关宏
__x86_64__是否为 x86-64 架构无参数#ifdef __x86_64__
__i386__是否为 x86 架构(32 位)无参数#ifdef __i386__
__ARM_ARCHARM 架构版本(如 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 }

注释说明

  1. 版本检查
    cpp #if __GNUC__ >= 10 // 使用 GCC 10+ 特性 #endif
  2. 条件编译
    cpp #if defined(__linux__) && defined(__x86_64__) // Linux x86-64 专用代码 #endif
  3. 属性扩展
    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 次版本号(如 0printf("%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)返回 01
__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__
__riscvRISC-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__
_WIN64Windows 64 位系统#ifdef _WIN64
__CYGWIN__Cygwin 环境#ifdef __CYGWIN__
__OpenBSD__OpenBSD 系统#ifdef __OpenBSD__
TARGET_OS_IPHONEiOS 平台#if TARGET_OS_IPHONEApple 特有
TARGET_OS_MACmacOS 平台#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 }

注释说明

  1. 版本检查
    cpp #if __clang_major__ >= 15 // 使用 Clang 15+ 特性 #endif
  2. 特性检测
    cpp #if __has_feature(modules) @import Foundation; // Objective-C 模块支持 #endif
  3. 平台适配
    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_VERMSVC 编译器版本(如 1930 表示 VS2022)#if _MSC_VER >= 1930VS2022: 1930, VS2019: 1920
_MSC_FULL_VER完整版本号(如 193030704printf("%d", _MSC_FULL_VER);包含补丁号
_MSC_BUILD编译器构建号#if _MSC_BUILD > 1000
_MSVC_LANG支持的 C++ 标准版本(如 201703L#if _MSVC_LANG >= 201703L类似 __cplusplus,但更准确
__cplusplusC++ 标准版本(需启用 /Zc:__cplusplus#if __cplusplus >= 201703L默认不准确,需手动启用
_CHAR_UNSIGNEDchar 是否为无符号类型#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 _WIN3232/64 位均定义
_WIN64是否为 64 位 Windows#ifdef _WIN64
_M_IX86x86 架构(32 位)#ifdef _M_IX86
_M_X64x64 架构#ifdef _M_X64
_M_ARMARM 架构(32 位)#ifdef _M_ARM
_M_ARM64ARM64 架构#ifdef _M_ARM64
_M_PPCPowerPC 架构(已弃用)#ifdef _M_PPC
_ATL_VERATL 库版本#if _ATL_VER >= 0x0E00
_MFC_VERMFC 库版本#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_WINNTWindows 目标版本(如 0x0A00 表示 Win10)#if _WIN32_WINNT >= 0x0A00需在 <sdkddkver.h> 中定义
NTDDI_VERSIONWindows SDK 版本#if NTDDI_VERSION >= NTDDI_WIN10
WINAPI_FAMILYWindows 应用类型(如 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 }

注释说明

  1. 版本检查
    cpp #if _MSC_VER >= 1930 // 使用 VS2022+ 特性 #endif
  2. 平台适配
    cpp #if defined(_M_IX86) // x86 专用代码 #elif defined(_M_X64) // x64 专用代码 #endif
  3. 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))