【问题标题】:Where is the clang <built-in> header file?clang <built-in> 头文件在哪里?
【发布时间】:2020-07-11 11:51:16
【问题描述】:

我正在挖掘一些 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__ 宏,并且根据提供的行号这一事实判断,该标头似乎是一个实际文件。但是,我在/usr 中递归地搜索#define __WCHAR_TYPE__ int,并且在gcc 的头文件之外找不到任何东西。所以,我的问题是,这个“内置”头文件是不是一个实际的文件,如果是,我在哪里可以找到它?

【问题讨论】:

  • 您是否尝试过您的 IDE 的“转到定义”?
  • @bolov 我觉得这在这种特殊情况下行不通。

标签: c gcc clang internals


【解决方案1】:

这不是一个实际的文件; 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 大多支持相同的命令行选项)。 &lt;stddef.h&gt; 中的 #define 可能只是作为备用。

【讨论】:

  • 哇,这很奇怪。感谢您提供有见地的信息!
猜你喜欢
  • 2014-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-21
  • 1970-01-01
  • 2014-12-19
  • 2010-09-25
  • 2011-06-23
相关资源
最近更新 更多