簡體   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