我需要一个工具(命令行,脚本或源代码),它使用给定的预处理器定义和包含路径来提取源文件(递归)包含的所有包含文件。我想知道可以找到的那些和那些没有找到的那些。可以找到的包含文件应该被递归解析。
我知道
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
并获得:
和
.getAllIncludes main.cpp -I includepath1;includepath2
我会得到:
我知道deafault标头也可能定义了一些值。但在我的情况下,我不需要这些信息,因为项目源代码不依赖于任何定义。如果这样,我用这个预处理器定义...
来提供我的工具最后,该工具运行良好。它在所有必要文件上递归运行,最后我得到了项目所需的所有文件。当然有一些小的限制,我不想命名所有(例如源文件名的每个标题都有相同的名称,......)。
答案 0 :(得分:2)
使用gcc -M <source_file>
,代码不会被编译,只能由预编译器处理。并且,您可能发现使用预编译器处理源的任何解决方案都是正确的。想象一下,某个地方的源代码具有以下代码段:
#ifdef USE_BOOST_SUPERLIB
# include <boost/superlib.hpp>
#endif
然后在没有预处理的情况下,您无法知道是否包含<boost/superlib.hpp>
。