前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++内置宏定义

C++内置宏定义

作者头像
hotarugali
发布2022-03-08 14:27:57
1.8K0
发布2022-03-08 14:27:57
举报
文章被收录于专栏:hotarugaliの技术分享

1. 标准内置宏定义

标准内置宏定义是由相关的语言标准定义的,因此对于实现了这些语言标准的编译器来说都是可使用的。

  • __FILE__:字符串格式,指示当前处理的文件路径。
  • __LINE__:数字格式,指示当前处理的代码行号。
  • #line:用来修改当前行的下一行的行号,即下一行的 __LINE__#line 所指定的数字开始。
代码语言:javascript
复制
#include<stdio.h>

int main()
{
	printf("Line: %d\n", __LINE__);		// 5
	#line 100
	printf("Line: %d\n", __LINE__);	 	// 100
	return 0;
}

【注】__FILE____LINE__ 宏主要用于错误处理,可以很方便地定位错误位置。

  • C99 引入了 __func__,它和 GCC 提供的 __FUNCTION__ 功能类似,二者都是字符串格式,指示当前处理的函数名。

【注】__func____FUNCTION__ 本质上都不是宏,因为预处理器并不知道当前处理的函数名。

  • __DATE__:字符串格式,指示预处理器处理当前代码时的日期。
  • __TIME__:字符串格式,指示预处理器处理当前代码时的时间。
  • __STDC__:常数格式,一般值为 1,用来告诉编译器遵守 ISO 标准 C 格式。
  • __STDC_VERSION__:常数格式,指示当前使用的 C 语言标准版本,格式为 yyyymmL,其中 yyyymm 分别表示年份和月份。
  • __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__ 在所有的优化编译中都定义了,比如 O1O2 等优化模式下;当编译器优化文件大小而不是运行速度时,__OPTIMIZE_SIZE__ 被定义;当编译器内联展开被禁止时,__NO_INLINE__ 被定义。
  • __CHAR_UNSIGNED____WCHAR_UNSIGNED__:GCC 定义了宏 __CHAR_UNSIGNED____WCHAR_UNSIGNED__ 当且仅当数据类型 charwchat_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 所有内置宏定义,可以使用以下命令:

代码语言:javascript
复制
gcc -dM -E - < /dev/null

2.2 查看 G++ 所有内置宏定义

如果想要查看当前系统下的 G++ 所有内置宏定义,可以使用以下命令:

代码语言:javascript
复制
g++ -dM -E -x c++ - < /dev/null

3. 系统内置宏定义

对于某些特定系统本身内置的一些宏,GCC 提供和其等价的宏,等价宏的命名在原有宏名称基础上,首尾加上一个或多个下划线,保证首尾下划线数均为 2。比如 Unix 系统的 unix 宏,则 GCC 提供 __unix__ 宏;而对于 _mpis 宏,则 GCC 提供 __mips__ 宏。

4. 内置操作符宏定义

C++ 定义了 11 个操作符宏,如下表所示:

操作符

操作符宏

&&

and

&=

and_eq

&

bitand

|

bitor

~

compl

!

not

!=

not_eq

||

or

|=

or_eq

^

xor

^=

xor_eq

如果想要在 C 语言中使用 C++ 中定义的这 11 个操作符宏,可以引入 iso646.h 头文件。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-06-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 标准内置宏定义
  • 2. 公共内置宏定义
    • 2.1 查看 GCC 所有内置宏定义
      • 2.2 查看 G++ 所有内置宏定义
      • 3. 系统内置宏定义
      • 4. 内置操作符宏定义
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档