C++内置宏定义
1. 标准内置宏定义
标准内置宏定义是由相关的语言标准定义的,因此对于实现了这些语言标准的编译器来说都是可使用的。
- __FILE__:字符串格式,指示当前处理的文件路径。
- __LINE__:数字格式,指示当前处理的代码行号。
- #line:用来修改当前行的下一行的行号,即下一行的- __LINE__由- #line所指定的数字开始。
| 1 |  | 
【注】__FILE__ 和 __LINE__ 宏主要用于错误处理,可以很方便地定位错误位置。
- C99 引入了 __func__,它和 GCC 提供的__FUNCTION__功能类似,二者都是字符串格式,指示当前处理的函数名。
【注】__func__ 和 __FUNCTION__ 本质上都不是宏,因为预处理器并不知道当前处理的函数名。
- __DATE__:字符串格式,指示预处理器处理当前代码时的日期。
- __TIME__:字符串格式,指示预处理器处理当前代码时的时间。
- __STDC__:常数格式,一般值为- 1,用来告诉编译器遵守 ISO 标准 C 格式。
- __STDC_VERSION__:常数格式,指示当前使用的 C 语言标准版本,格式为- yyyymmL,其中- yyyy和- mm分别表示年份和月份。
- __STDC_HOSTED__:数字格式,- 1表示要编译的对象是一个 Hosted Environment,否则表示不是。
【注】一个 Hosted Environment 表示具有可用的标准 C 库的完整功能。
- __cplusplus:当使用了 C++ 编译器时,该宏被定义。因此可以它来测试编译时使用的编译器是 C 编译器还是 C++ 编译器。当- __cplusplus被定义时,其格式和- __STDC_VERSION__类似,只不过指示的是 C++ 语言的标准版本号。
- __OBJC__:当使用了 Objective-C 编译器时,该宏被定义。因此可以它来测试编译时使用的编译器是 C 编译器还是 Objective-C 编译器。当- __OBJC__被定义时,其格式和- __STDC_VERSION__类似,只不过指示的是 Objective-C 语言的标准版本号。
- __ASSEMBLER__:当预处理汇编语言时,该宏被定义。
2. 公共内置宏定义
公共内置宏定义是 GNU C 的扩展,只要使用了 GNU C 或者 GNU Fortran,这些宏都是可使用的。公共内置宏定义数量繁多,因此仅介绍常用的一些宏,更多可以参见官方文档:Common Predefined Macros
- __COUNTER__:累加器,每次使用一次就递增- 1。因此可以用来当作唯一标识符使用。
- __GNUC__、- __GNUC_MINOR__、- __GNUC_PATCHLEVEL__:这些宏在使用了 C 预处理器的所有编译器中都定义了。它们分别指示了编译器的主版本号、次版本号和补丁版本号,均为整数常数。
- __BASE_FILE__:字符串格式,指示了主文件的路径。
- __FILE_NAME__:字符串格式,指示了当前文件路径的 Basename,即文件名。
- __INCLUDE_LEVEL__:数字格式,指示了当前嵌套深度。从- 0开始,每进入一次- #include指示的头文件,- __INCLUDE_LEVEL__增加- 1。
- __VERSION__:字符串格式,指示了编译器的版本号。
- __OPTIMIZE__、- __OPTIMIZE_SIZE__、- __NO_INLINE__:这些宏描述了编译模式。- __OPTIMIZE__在所有的优化编译中都定义了,比如- O1、- O2等优化模式下;当编译器优化文件大小而不是运行速度时,- __OPTIMIZE_SIZE__被定义;当编译器内联展开被禁止时,- __NO_INLINE__被定义。
- __CHAR_UNSIGNED__、- __WCHAR_UNSIGNED__:GCC 定义了宏- __CHAR_UNSIGNED__、- __WCHAR_UNSIGNED__当且仅当数据类型- char或- wchat_t在目标主机上是无符号类型。
- __CHAR_BIT__:数字格式,表示一个- char数据类型占用多少 bit。
- __BYTE_ORDER__、- __ORDER_LITTLE_ENDIAN__、- __ORDER_BIG_ENDIAN__、- __ORDER_PDP_ENDIAN__:- __BYTE_ORDER__取值只能是- __ORDER_LITTLE_ENDIAN__、- __ORDER_BIG_ENDIAN__、- __ORDER_PDP_ENDIAN__中的一种。表示多字节/字数据的存储模式,- __ORDER_LITTLE_ENDIAN__、- __ORDER_BIG_ENDIAN__即大小端模式,而- __ORDER_PDP_ENDIAN__表示对于 16 位的字按照小端模式存储,对于 32 位双字中的 16 位子字是按照大端模式存储的。
- __FLOAT_WORD_ORDER__:表示浮点双字的存储模式,其值只能取- __ORDER_LITTLE_ENDIAN__和- __ORDER_BIG_ENDIAN__中的一种。
GCC 定义了一批和数据类型对应的宏,如下表所示:
| 数据类型 | 数据类型宏 | 
|---|---|
| size_t | __SIZE_TYPE__ | 
| ptrdiff_t | __PTRDIFF_TYPE__ | 
| wchar_t | __WCHAR_TYPE__ | 
| wint_t | __WINT_TYPE__ | 
| intmax_t | __INTMAX_TYPE__ | 
| uintmax_t | __UINTMAX_TYPE__ | 
| sig_atomic_t | __SIG_ATOMIC_TYPE__ | 
| int8_t | __INT8_TYPE__ | 
| int16_t | __INT16_TYPE__ | 
| int32_t | __INT32_TYPE__ | 
| int64_t | __INT64_TYPE__ | 
| uint8_t | __UINT8_TYPE__ | 
| uint16_t | __UINT16_TYPE__ | 
| uint32_t | __UINT32_TYPE__ | 
| uint64_t | __UINT64_TYPE__ | 
| int_least8_t | __INT_LEAST8_TYPE__ | 
| int_least16_t | __INT_LEAST16_TYPE__ | 
| int_least32_t | __INT_LEAST32_TYPE__ | 
| int_least64_t | __INT_LEAST64_TYPE__ | 
| uint_least8_t | __UINT_LEAST8_TYPE__ | 
| uint_least16_t | __UINT_LEAST16_TYPE__ | 
| uint_least32_t | __UINT_LEAST32_TYPE__ | 
| uint_least64_t | __UINT_LEAST64_TYPE__ | 
| int_fast8_t | __INT_FAST8_TYPE__ | 
| int_fast16_t | __INT_FAST16_TYPE__ | 
| int_fast32_t | __INT_FAST32_TYPE__ | 
| int_fast64_t | __INT_FAST64_TYPE__ | 
| uint_fast8_t | __UINT_FAST8_TYPE__ | 
| uint_fast16_t | __UINT_FAST16_TYPE__ | 
| uint_fast32_t | __UINT_FAST32_TYPE__ | 
| uint_fast64_t | __UINT_FAST64_TYPE__ | 
| intptr_t | __INTPTR_TYPE__ | 
| uintptr_t | __UINTPTR_TYPE__ | 
GCC 定义了一批表示数据类型最大/小值的宏,如下表所示:
| 数据类型 | 数据类型最大值宏 | 
|---|---|
| signed char | __SCHAR_MAX__ | 
| wchar_t | __WCHAR_MAX__ | 
| signed short | __SHRT_MAX__ | 
| signed int | __INT_MAX__ | 
| signed long | __LONG_MAX__ | 
| signed long long | __LONG_LONG_MAX__ | 
| wint_t | __WINT_MAX__ | 
| size_t | __SIZE_MAX__ | 
| ptrdiff_t | __PTRDIFF_MAX__ | 
| intmax_t | __INTMAX_MAX__ | 
| uintmax_t | __UINTMAX_MAX__ | 
| sig_atomic_t | __SIG_ATOMIC_MAX__ | 
| int8_t | __INT8_MAX__ | 
| int16_t | __INT16_MAX__ | 
| int32_t | __INT32_MAX__ | 
| int64_t | __INT64_MAX__ | 
| uint8_t | __UINT8_MAX__ | 
| uint16_t | __UINT16_MAX__ | 
| uint32_t | __UINT32_MAX__ | 
| uint64_t | __UINT64_MAX__ | 
| int_least8_t | __INT_LEAST8_MAX__ | 
| int_least16_t | __INT_LEAST16_MAX__ | 
| int_least32_t | __INT_LEAST32_MAX__ | 
| int_least64_t | __INT_LEAST64_MAX__ | 
| uint_least8_t | __UINT_LEAST8_MAX__ | 
| uint_least16_t | __UINT_LEAST16_MAX__ | 
| uint_least32_t | __UINT_LEAST32_MAX__ | 
| uint_least64_t | __UINT_LEAST64_MAX__ | 
| int_fast8_t | __INT_FAST8_MAX__ | 
| int_fast16_t | __INT_FAST16_MAX__ | 
| int_fast32_t | __INT_FAST32_MAX__ | 
| int_fast64_t | __INT_FAST64_MAX__ | 
| uint_fast8_t | __UINT_FAST8_MAX__ | 
| uint_fast16_t | __UINT_FAST16_MAX__ | 
| uint_fast32_t | __UINT_FAST32_MAX__ | 
| uint_fast64_t | __UINT_FAST64_MAX__ | 
| intptr_t | __INTPTR_MAX__ | 
| uintptr_t | __UINTPTR_MAX__ | 
| wchar_t | __WCHAR_MIN__ | 
| wint_t | __WINT_MIN__ | 
| sig_atomic_t | __SIG_ATOMIC_MIN__ | 
GCC 还定义了一批表示数据类型占用字节数的宏,如下表所示:
| 数据类型 | 数据类型占用字节数宏 | 
|---|---|
| int | __SIZEOF_INT__ | 
| long | __SIZEOF_LONG__ | 
| long long | __SIZEOF_LONG_LONG__ | 
| short | __SIZEOF_SHORT__ | 
| void * | __SIZEOF_POINTER__ | 
| float | __SIZEOF_FLOAT__ | 
| double | __SIZEOF_DOUBLE__ | 
| long double | __SIZEOF_LONG_DOUBLE__ | 
| size_t | __SIZEOF_SIZE_T__ | 
| wchar_t | __SIZEOF_WCHAR_T__ | 
| wint_t | __SIZEOF_WINT_T__ | 
| ptrdiff_t | __SIZEOF_PTRDIFF_T__ | 
【注】在某些特定系统上,GCC 如果没有提供 stdint.h 头文件,则上表中的某些数据类型对应的宏可能就未被定义。
2.1 查看 GCC 所有内置宏定义
如果想要查看当前系统下的 GCC 所有内置宏定义,可以使用以下命令:
| 1 |  | 
2.2 查看 G++ 所有内置宏定义
如果想要查看当前系统下的 G++ 所有内置宏定义,可以使用以下命令:
| 1 |  | 
3. 系统内置宏定义
对于某些特定系统本身内置的一些宏,GCC 提供和其等价的宏,等价宏的命名在原有宏名称基础上,首尾加上一个或多个下划线,保证首尾下划线数均为 2。比如 Unix 系统的 unix 宏,则 GCC 提供 __unix__ 宏;而对于 _mpis 宏,则 GCC 提供 __mips__ 宏。
4. 内置操作符宏定义
C++ 定义了 11 个操作符宏,如下表所示:
| 操作符 | 操作符宏 | 
|---|---|
| && | and | 
| &= | and_eq | 
| & | bitand | 
| ` | ` | 
| ~ | compl | 
| ! | not | 
| != | not_eq | 
| ` | |
| ` | =` | 
| ^ | xor | 
| ^= | xor_eq | 
如果想要在 C 语言中使用 C++ 中定义的这 11 个操作符宏,可以引入 iso646.h 头文件。
附录
参考资料:
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!