如何从C语言头中检索类型、变量、宏等的真实定义



如今,C语言编译器环境相当复杂。在确定某个头文件中定义的类型、变量、函数或宏的实际定义时,我经常遇到问题,因为它是由当前编译器选项激活的。

所包含的文件具有条件定义、条件包含等,这取决于选择哪种语言的编译器选项;标准";在特定的编译过程中使用。因此,很难检索在某些标头中有条件定义的结构的实际定义(例如(。我需要一种方法来显示或精确定位它的实际定义。

例如,以structtm的定义为例,它应该在time.h中定义。但是,您不会在GNU项目C编译器中找到它。

我总是可以参考文档(ISO/IEC 9899标准或GCC在线文档(,但在某些情况下,定义可能会根据我选择的标准或非标准编译器环境而更改。所以,问题是:

如何列出函数原型、宏、变量或类型的真实定义,因为当前激活的编译器正在根据所选的编译时选项对其进行处理


一些例子:

  • stdio.h中查找宏EOF的值
  • 找到";类型";CCD_ 5在CCD_
  • assert.h中查找assert宏的定义
  • time.h中查找struct timespec的定义
  • stdio.hfopen的原型定义中__restrict的含义是什么

根据所选编译时选项,我如何列出函数原型、宏、变量或类型的真实定义,因为编译器的当前激活正在处理它?

从C语言本身来看,你不能。C语言没有反射,它不能检查自己。

转到类型定义,导航和浏览源代码树-这些都是与C编程语言集成的IDE的工作,这不是编程语言本身的一部分。有大量可用的IDE与C集成,有语言服务器,还有C代码索引器,如ctags、GNUglobal。使用与编译器相同的选项和宏配置索引工具或IDE,该工具将帮助您完成代码编写。还有一些构建系统与IDE集成,因此构建系统调用的编译器会自动使用与索引器相同的命令行参数(就像在cmake的情况下使用compile_commands.json一样(。

例如,以struct-tm-的定义为例

例如,在安装了C和C++插件的情况下安装eclipse。创建新的C/C++ project,在那里创建some.c文件,然后键入#include <time.h>struct tm;。保存文件,让eclipse索引器对项目进行索引(应该是即时的(或单击Project->C/C++ Index->Rebuild。然后将光标放在tm字符串上并单击F3->中提琴,在我的电脑上光标进入/usr/include/bits/types/struct_tm.h文件。

但是,我的问题与gcc等命令行编译器有关
如何从C语言头中检索类型、变量、宏等的真实定义?

gcc是一个编译器,它不支持这样的功能。

最新更新