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

时间:2014-02-19 16:02:48

标签: c++ c-preprocessor

我需要一个工具(命令行,脚本或源代码),它使用给定的预处理器定义和包含路径来提取源文件(递归)包含的所有包含文件。我想知道可以找到的那些和那些没有找到的那些。可以找到的包含文件应该被递归解析。

我知道

    gcc -M /-MM       
    cl /P

解决方案,但这对我不起作用。一旦无法打开文件,预处理器就会停止。但此时我没有正确的文件路径,只是希望预处理器跳过该文件并告诉我它不能包含该文件

来自here 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

并获得:

  • 无法打开// - &gt;我现在不在乎,这是一个默认标题
  • 无法打开// - &gt;在这里,我可以提取我需要提升的信息
  • SharedClass.h
  • SharedDependenyClass.h // SharedClass包含的标题...
  • MyClass.h
  • TestClass.h // MyClass标题包含的标题...
  • TestClass2.h // TestClass标题包含的标题...
  • OptClass.h

.getAllIncludes main.cpp -I includepath1;includepath2 

我会得到:

  • 无法打开// - &gt;我现在不在乎,这是一个默认标题
  • 无法打开// - &gt;在这里,我可以提取我需要提升的信息
  • SharedClass.h
  • SharedDependenyClass.h // SharedClass包含的标题...
  • MyClass.h
  • TestClass.h // MyClass标题包含的标题...
  • TestClass2.h // TestClass标题包含的标题...

我知道deafault标头也可能定义了一些值。但在我的情况下,我不需要这些信息,因为项目源代码不依赖于任何定义。如果这样,我用这个预处理器定义...

来提供我的工具

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

1 个答案:

答案 0 :(得分:2)

使用gcc -M <source_file>,代码不会被编译,只能由预编译器处理。并且,您可能发现使用预编译器处理源的任何解决方案都是正确的。想象一下,某个地方的源代码具有以下代码段:

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

然后在没有预处理的情况下,您无法知道是否包含<boost/superlib.hpp>