clang 头文件在哪里?

问题描述 投票:1回答:1

[我正在研究一些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的头文件中找不到任何东西。因此,我的问题是,此“内置”头文件是否为实际文件,如果是,我在哪里可以找到它?

c gcc clang internals
1个回答
2
投票

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

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

#define __WCHAR_TYPE__ int

在叮当声源中,这全部在clang/lib/Frontend/InitPreprocessor.cpp中完成。

gcc实际上也有它(运行clang/lib/Frontend/InitPreprocessor.cppgcc -dM -E foo.cclang主要支持相同的命令行选项)。 gcc中的#define可能只是备份。

© www.soinside.com 2019 - 2024. All rights reserved.