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 | gcc -dM -E - < /dev/null |
2.2 查看 G++ 所有内置宏定义
如果想要查看当前系统下的 G++ 所有内置宏定义,可以使用以下命令:
1 | g++ -dM -E -x c++ - < /dev/null |
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-NC-SA 4.0 许可协议。转载请注明来自 お前はどこまで見えている!
评论
WalineTwikoo