如何从位于/usr/include中的Linux头文件中获取函数名

如何从位于/usr/include中的Linux头文件中获取函数名,c,linux,header,gnu,C,Linux,Header,Gnu,我们在/usr/include 我正在寻找一种方法来打开和读取包含文件,并对其进行解析,以打印位于其中的所有声明函数。 任何人都可以解释或提供有关此标题格式的链接。 我这样做是因为我正在尝试做一个C自动完成插件,如果我包含一个文件。h该插件将为我提供所有函数都位于该文件中。h。如果您需要特定的标准库模块,请用谷歌搜索它们。例如: 这是谷歌搜索“string.h”的第一个结果。它详细介绍了cstring中提供的所有功能 如果您想跟踪/usr/include的所有子目录中的所有头中的所有函数,我可

我们在
/usr/include

我正在寻找一种方法来打开和读取包含文件,并对其进行解析,以打印位于其中的所有声明函数。
任何人都可以解释或提供有关此标题格式的链接。

我这样做是因为我正在尝试做一个C自动完成插件,如果我包含一个文件。h该插件将为我提供所有函数都位于该文件中。h。

如果您需要特定的标准库模块,请用谷歌搜索它们。例如:

这是谷歌搜索“string.h”的第一个结果。它详细介绍了cstring中提供的所有功能

如果您想跟踪/usr/include的所有子目录中的所有头中的所有函数,我可以为您提供一个简短的bash脚本,但我并不真正理解这一点

干杯


编辑:或者像扎克在上面评论的那样,有一个问题。好链接,扎克

如果您想要特定的标准库模块,请用谷歌搜索它们。例如:

这是谷歌搜索“string.h”的第一个结果。它详细介绍了cstring中提供的所有功能

如果您想跟踪/usr/include的所有子目录中的所有头中的所有函数,我可以为您提供一个简短的bash脚本,但我并不真正理解这一点

干杯


编辑:或者像扎克在上面评论的那样,有一个问题。好链接,扎克

手册页的部分
0p
包含POSIX头的手册页,以及每个手册页中定义的内容(或者说应该定义的内容)。

手册页的部分
0p
包含POSIX头的手册页,以及定义的内容(或者说应该定义的内容)每个人都有这样的定义。

每个人在职业生涯中都会至少要求一次这样的工具;扫描C源代码并打印出函数/变量名列表或不同模块之间函数调用的交叉引用的东西

为了充分满足您的要求,您必须编写基本上是C编译器前端的程序;再多的正则表达式魔法也无法满足您的需求。获取C语言语法的
yacc
able版本,然后使用
lex
yacc
(或
flex
bison
,或您选择的工具)创建解析器。然而,当您匹配一个函数声明时,您只需将其打印出来(或保存到数据库或类似的东西),而不是生成机器指令

通过现有的C预处理器(例如,
gcc-e
)运行感兴趣的标题,去掉注释并执行任何宏扩展,然后将结果文件馈送到解析器中

编辑

现在我实际阅读了
gcc
手册页,这里有一个选项
-aux info
,它将编写翻译单元中声明/定义的所有函数的原型声明,包括在包含的头文件中声明的函数。更好的是,输出的格式比较好,比较规则,应该比较容易解析


所以,吸取的教训是:检查你的编译器文档,忽略像我这样仍然用80年代老式工具思考的老家伙

每个人最终都会在职业生涯中至少要求一次这样的工具;扫描C源代码并打印出函数/变量名列表或不同模块之间函数调用的交叉引用的东西

为了充分满足您的要求,您必须编写基本上是C编译器前端的程序;再多的正则表达式魔法也无法满足您的需求。获取C语言语法的
yacc
able版本,然后使用
lex
yacc
(或
flex
bison
,或您选择的工具)创建解析器。然而,当您匹配一个函数声明时,您只需将其打印出来(或保存到数据库或类似的东西),而不是生成机器指令

通过现有的C预处理器(例如,
gcc-e
)运行感兴趣的标题,去掉注释并执行任何宏扩展,然后将结果文件馈送到解析器中

编辑

现在我实际阅读了
gcc
手册页,这里有一个选项
-aux info
,它将编写翻译单元中声明/定义的所有函数的原型声明,包括在包含的头文件中声明的函数。更好的是,输出的格式比较好,比较规则,应该比较容易解析


所以,吸取的教训是:检查你的编译器文档,忽略像我这样仍然用80年代老式工具思考的老家伙

编写一个LEXer和一个YACCer来检查开发人员的源代码,并将它们与开发人员的$INCLUDE\u路径中的源代码相匹配

包含路径中的文件与普通头文件的格式相同。关键词相同;但是,您可能会遇到像“extern”这样的词,对于初学者程序员来说,这些词可能并不常见。我建议您完全了解这些关键字,并了解它们在头文件中不同位置的功能

P:对于一个更复杂的解决方案,你必须考虑条件宏。


干杯。

编写一个LEXer和一个YACCer来检查开发人员的源代码,并将它们与开发人员的$INCLUDE\u路径中的源代码相匹配

包含路径中的文件与普通头文件的格式相同。关键词相同;但是,您可能会遇到像“extern”这样的词,对于初学者程序员来说,这些词可能并不常见。我建议您完全了解这些关键字,并了解它们在头文件中不同位置的功能

P:对于一个更复杂的解决方案,你必须考虑条件宏。

欢呼
$ cscope -bcq /usr/include/string.h
$ cscope -d -L1strcat
/usr/include/string.h strcat 92 extern char *strcat (char *__restrict __dest, __const char *__restrict __src)
/usr/include/bits/string.h strcat 963 #define strcat(dest, src) \
/usr/include/bits/string3.h strcat 164 #define strcat(dest, src) \