[英]Get all include files of a cpp file considering preprocessor defines (fast)
我需要一个工具(命令行,脚本或源代码)来提取具有给定预处理器定义并包含路径的源文件(递归)所包含的所有inlcude文件。 我想知道可以找到的,而找不到的。 可以找到的包含文件应递归解析。
我知道
gcc -M /-MM
cl /P
解决方案,但这对我不起作用。 一旦无法打开文件,预处理器就会停止。 但是目前我没有该文件的正确路径,只是希望预处理器跳过该文件并告诉我它不能包含该文件
同样, 此处的cinclude2dot.pl没用 ,因为似乎没有考虑给定的预处理程序定义。
CodeProject的包含文件层次结构查找器非常有用。 它考虑了预处理器标志,并向我显示了所有包含文件。 甚至无法打开的包含。 但这是用MFC编写的,因此我必须为gcc重新实现它,这并不是那么简单,因为即使在解析器内部也使用了许多WinAPI东西。
因此,也许有人知道另一种解决方案。
一个简单的例子:
main.cpp
#include <iostream>
#include <string>
#include <boost/foreach.hpp>
#include <SharedClass.h>
#include "MyClass.h"
#ifdef FOO
#include <OptClass.h>
#endif
int main() {}
现在,我开始进行包含提取,例如(简化):
.getAllIncludes main.cpp -I includepath1;includepath2 -PD FOO
并获得:
和为
.getAllIncludes main.cpp -I includepath1;includepath2
我将获得:
我知道默认的头文件可能还会定义一些值。 但就我而言,我不需要这些信息,因为项目源代码不依赖于任何定义。 如果是这样的话,我用这个预处理器定义来喂我的工具...
最后,该工具运行良好。 它以递归方式运行所有必需的文件,最后我拥有了该项目所需的所有文件。 当然,还有一些我不想命名的小限制(例如,源文件名的每个标头都具有相同的名称,...)。
使用gcc -M <source_file>
,不编译代码,仅由预编译器处理。 而且,您可能会发现,任何解决方案都需要使用预编译器来处理源,这是正确的。 想象一下,该源在某处具有以下片段:
#ifdef USE_BOOST_SUPERLIB
# include <boost/superlib.hpp>
#endif
那么如果没有预处理,您将无法知道是否包含<boost/superlib.hpp>
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.