命令: gcc -E -dM - < /dev/null
命令参数解释:
gcc
:GNU编译器集合中的C编译器。-E
:只执行编译器的预处理阶段,不进行编译和链接。-dM
:预处理宏定义。这个选项告诉编译器仅预处理并输出所有预定义的宏。-
:表示标准输入(stdin),这里指没有实际的源代码文件,而是从标准输入读取数据(在这种情况下是空数据,因为重定向自/dev/null
)。< /dev/null
:输入重定向,意味着gcc
命令将从/dev/null
读取输入,/dev/null
是一个特殊的文件,它会丢弃所有写入其中的数据,并且读取操作会立即返回EOF(文件结束符)。
执行 gcc -E -dM - < /dev/null
命令的结果:输出的每一行都是一个宏定义,这些宏定义是编译器在编译过程中识别和使用的。这些宏定义可以提供关于编译器特性、系统特性、类型大小等信息。
如:
#define __SSP_STRONG__ 3
:表示编译器支持强栈保护功能。#define __UINT_LEAST16_MAX__ 0xffff
:表示unsigned least 16-bit integer
类型的最大值。#define __ATOMIC_ACQUIRE 2
:表示原子操作的获取屏障。#define __FLT128_MAX_10_EXP__ 4932
:表示128位浮点数最大10指数。#define __unix__ 1
:表示编译目标是UNIX系统。#define __x86_64 1
:表示编译目标是x86_64架构。#define __UINT_FAST64_MAX__ 0xffffffffffffffffUL
:表示unsigned fast 64-bit integer
类型的最大值。#define __GNUC__ 9
:表示使用的GCC版本主版本号。#define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__
:表示系统的字节序是小端序。#define __STDC_VERSION__ 201710L
:表示支持的C标准版本是C17。- #define __STDC__ 1 :如果
__STDC__
被定义,这意味着编译器至少支持C89标准。__STDC__
宏定义为1
并不意味着编译器不支持更新的C语言标准。实际上,许多现代编译器支持多个C语言标准,并且可以根据编译选项来选择不同的标准。例如,GCC和Clang编译器都支持从C89到C11等多个标准,并且可以通过编译器选项(如-std=c11
)来指定使用哪个标准。在这种情况下,即使__STDC__
被定义,编译器也可能定义其他宏来指示支持更新的标准,如__STDC_VERSION__
用于指示具体的标准版本。 - #define __SIZEOF_INT__ 4 表明在当前平台上,
int
类型的大小为 4 字节(即 32 位)。 - #define __SIZEOF_POINTER__ 8 这个宏定义表明在当前平台上,指针(
void*
或任何其他指针类型)的大小为 8 字节(即 64 位)。这通常意味着该平台是 64 位系统,因为指针大小通常与系统的 word size(一个字的大小)相匹配。这对于确定可以存储在指针中的地址空间大小以及进行适当的内存分配和数据结构设计非常重要。