奇思妙想 · 2024年 3月 31日 0

如何获取预处理器定义了哪些宏?

112 次浏览
  • GCC/G++ 提供了-dM选项可抓取预处理器预定义了哪些宏,可方便程序员了解差异。
    对于C代码,用gcc -dM -E -x c /dev/null
    对于C++, 用g++ -dM -E -x c++ /dev/null
    - 可以看到形如#define __amd64__ 1之类的定义,可判断是64位还是32位。
例如:
......
#define __x86_64 1
#define __INT_FAST64_TYPE__ long int
#define __FLT64_DENORM_MIN__ 4.94065645841246544176568792868221372e-324F64
#define __DBL_MIN__ ((double)2.22507385850720138309023271733240406e-308L)
#define __FLT128_EPSILON__ 1.92592994438723585305597794258492732e-34F128
#define __FLT64X_NORM_MAX__ 1.18973149535723176502126385303097021e+4932F64x
#define __SIZEOF_POINTER__ 8
#define __SIZE_TYPE__ long unsigned int
#define __LP64__ 1
......
  • Clang类似GCC,但不能用/dev/null作为参数。
    clang -dM -E -x c xxx.c
  • MSVC 提供/PD /Zc:preprocessor参数选项可以输出所有预定义的宏。
    cl /PD /Zc:preprocessor xxxxx.c
    例如:
    #define _MSC_EXTENSIONS 1
    #define _MSC_BUILD 0
    #define _IS_ASSIGNABLE_NOCHECK_SUPPORTED 1
    #define _M_IX86_FP 2
    #define _MT 1
    #define _MSVC_WARNING_LEVEL 1L
    #define STDC_HOSTED 1
    #define _MSC_FULL_VER 193030706
    #define _MSC_VER 1930
    #define _MSVC_TRADITIONAL 0
    #define _M_IX86 600
    #define TEST_STDIO 11
    #define _MSVC_EXECUTION_CHARACTER_SET 936
    #define _INTEGRAL_MAX_BITS 64
    #define _WIN32 1