繁体   English   中英

考虑预处理器定义,获取cpp文件的所有包含文件(快速)

[英]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

并获得:

  • 无法打开//->我现在不在乎,这是默认标头
  • 无法打开//-->在这里我可以提取需要增强的信息
  • 共享类
  • SharedDependenyClass.h // SharedClass包含的标头...
  • MyClass.h
  • TestClass.h // MyClass标头中包含的标头...
  • TestClass2.h // TestClass头包含的头...
  • OptClass.h

和为

.getAllIncludes main.cpp -I includepath1;includepath2 

我将获得:

  • 无法打开//->我现在不在乎,这是默认标头
  • 无法打开//-->在这里我可以提取需要增强的信息
  • 共享类
  • SharedDependenyClass.h // SharedClass包含的标头...
  • MyClass.h
  • TestClass.h // MyClass标头中包含的标头...
  • TestClass2.h // TestClass头包含的头...

我知道默认的头文件可能还会定义一些值。 但就我而言,我不需要这些信息,因为项目源代码不依赖于任何定义。 如果是这样的话,我用这个预处理器定义来喂我的工具...

最后,该工具运行良好。 它以递归方式运行所有必需的文件,最后我拥有了该项目所需的所有文件。 当然,还有一些我不想命名的小限制(例如,源文件名的每个标头都具有相同的名称,...)。

使用gcc -M <source_file> ,不编译代码,仅由预编译器处理。 而且,您可能会发现,任何解决方案都需要使用预编译器来处理源,这是正确的。 想象一下,该源在某处具有以下片段:

#ifdef USE_BOOST_SUPERLIB
#  include <boost/superlib.hpp>
#endif

那么如果没有预处理,您将无法知道是否包含<boost/superlib.hpp>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM