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

Where is the clang <built-in> header file?

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

typedef __WCHAR_TYPE__ wchar_t;

这与我在 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

在 gcc 的 stddef.h 中,__WCHAR_TYPE__ 被明确定义为 int,但在 clang 的 stddef.h 中,除了以下任何地方都没有提到 __WCHAR_TYPE__那一行。所以,我决定自己定义宏,以便找出宏定义的位置。我用 clang 编译了以下文件:

#define __WCHAR_TYPE__ x

而且,我收到以下警告:

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

似乎有某种 "built-in" header 定义了 __WCHAR_TYPE__ 宏,而 header 似乎是一个实际文件,根据提供行号的事实。但是,我在 /usr 中递归地搜索 #define __WCHAR_TYPE__ int,但在 gcc 的 header 文件之外我找不到任何东西。所以,我的问题是,这个 "built-in" header 文件是一个实际文件吗?如果是,我在哪里可以找到它?

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

您可以通过执行 clang -dM -E foo.c 查看所有这些宏,其中 foo.c 是任何文件(它甚至可以是空的)。在我看到的列表中

#define __WCHAR_TYPE__ int

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

中完成的

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