[我正在研究一些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
似乎有某种定义了__WCHAR_TYPE__
宏的“内置”标头,并且从提供行号的事实来看,该标头似乎是实际的文件。但是,我递归地为#define __WCHAR_TYPE__ int
中的/usr
进行了grep筛选,但是在gcc的头文件中找不到任何东西。因此,我的问题是,此“内置”头文件是否为实际文件,如果是,我在哪里可以找到它?
这不是实际文件; clang内置了许多预定义的宏。
您可以通过执行clang -dM -E foo.c
来查看所有这些宏,其中foo.c
是任何文件(甚至可以为空)。在我看到的列表中
#define __WCHAR_TYPE__ int
在叮当声源中,这全部在
clang/lib/Frontend/InitPreprocessor.cpp
中完成。
gcc实际上也有它(运行clang/lib/Frontend/InitPreprocessor.cpp
; gcc -dM -E foo.c
和clang
主要支持相同的命令行选项)。 gcc
中的#define
可能只是备份。