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.c
;clang
和 gcc
大多支持相同的命令行选项)。 <stddef.h>
中的 #define
可能只是作为备份。
我正在研究一些 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.c
;clang
和 gcc
大多支持相同的命令行选项)。 <stddef.h>
中的 #define
可能只是作为备份。