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