clang <built-in> 头文件在哪里?

Apl*_*123 2 c gcc internals clang

我在挖掘一些 C 内部结构,并从 clang 中找到了以下行stddef.h(位于/usr/lib/llvm-11/lib/clang/11.0.0/include/):

typedef __WCHAR_TYPE__ wchar_t;
Run Code Online (Sandbox Code Playgroud)

这与我在 gcc 中发现的不同stddef.h(位于/usr/lib/gcc/x86_64-pc-linux-gnu/10.0.1/include/):

#ifndef __WCHAR_TYPE__    
#define __WCHAR_TYPE__ int    
#endif    
#ifndef __cplusplus    
typedef __WCHAR_TYPE__ wchar_t;    
#endif
Run Code Online (Sandbox Code Playgroud)

在 gcc 中stddef.h__WCHAR_TYPE__被明确定义为 an int,但在 clang 中,除了这一行之外,stddef.h没有提到任何地方。__WCHAR_TYPE__于是,我决定自己定义一下宏,以便找出宏是在哪里定义的。我用 clang 编译了以下文件:

#define __WCHAR_TYPE__ x
Run Code Online (Sandbox Code Playgroud)

而且,我收到以下警告:

file.c:1:9: warning: '__WCHAR_TYPE__' macro redefined [-Wmacro-redefined]
#define __WCHAR_TYPE__ x
        ^
<built-in>:85:9: note: previous definition is here
#define __WCHAR_TYPE__ int
Run Code Online (Sandbox Code Playgroud)

似乎有某种定义__WCHAR_TYPE__宏的“内置”标头,并且根据提供的行号来判断,该标头似乎是一个实际的文件。然而,我递归地 grep for #define __WCHAR_TYPE__ intin /usr,但在 gcc 的头文件之外找不到任何东西。所以,我的问题是,这个“内置”头文件是实际文件吗?如果是,我在哪里可以找到它?

Nat*_*dge 6

它不是一个实际的文件;而是一个文件。clang 内置了许多预定义的宏。

您可以通过执行clang -dM -E foo.cwhere foo.cis any file (它甚至可以是空的)来查看所有这些宏。我看到的名单中

#define __WCHAR_TYPE__ int
Run Code Online (Sandbox Code Playgroud)

在 clang 源中,这一切都是在clang/lib/Frontend/InitPreprocessor.cpp.

gcc 实际上也有它(运行gcc -dM -E foo.cclang并且gcc大多支持相同的命令行选项)。里面可能只是作为备份#define<stddef.h>