2011-04-04 68 views
1

如何生成包含所有子目錄中所有其他頭文件的頂級包含文件?如何生成頂級包含文件

我正在處理這些子目錄中包含許多子目錄和許多頭文件的大型項目。子目錄包含更多的子目錄,而這些子目錄有更多的頭文件。它是一個像多層次結構的大樹。我想爲不希望手動包含標題的用戶提供頂級標題文件。頂級頭文件應包含所有其他具有相對路徑的頭文件。我正在用sed或awk自動化這個過程,但不知道如何開始。

任何提示,非常感謝。

謝謝。

回答

4

find . -name '*.h' | sed -e 's/\.\///' -e 's/^/#include "/' -e 's/$/"/' >> master.h

  • 找到所有.h文件
  • 帶龍頭 「./」
  • 在行
  • 的開頭添加#include "在行
  • 重定向的末尾添加"給master.h

但我不確定這是個好主意。

我寧願只包含必要的標題並儘可能少地保留所需的標題數量。

+1

sed的一次調用可以採用多個-e選項(按順序處理)。 – 2011-04-04 10:31:11

+0

@詹姆斯:太好了,謝謝。回答編輯。 – pmg 2011-04-04 10:45:16

4

你在正確的軌道上。就個人而言,我會使用find並將輸出傳遞給一個文件。喜歡的東西:

find . -name "*.h" -print > myBigHeader.h 

而且,你要在你的makefile應對依存產生,因此如果這些頭一個拿到的改變使將可以重新編譯依賴於它的對象。

+0

頂級標題僅供參考。我看到很多項目提供了這樣一個deader文件。 – pic11 2011-04-04 10:16:01

2
echo "#ifndef INCLUDEALLH" > includeall.h 
echo "#define INCLUDEALLH" >> includeall.h 
find . -name \*.h | sed 's,^[.]/,,' | while read line; do echo "#include \"$line\""; done >> includeall.h 
echo "#endif" >> includeall.h 
4

其他的答案告訴你如何做到這一點,將工作做好,但也有一些潛在的問題,這種方法:

  • 編譯時間可能更頭來顯著上升需要閱讀在和處理。

  • 對任何頭文件的更改將意味着使用全局頭文件的所有代碼都將被重建,即使它實際上並未使用已更改的部分。

  • 使得難以將項目視爲一系列較小的問題和子系統。

    的功能/變量名衝突和陰影
  • 潛力(尤其是用C沒有命名空間的限制範圍)

更好的解決方案是正確組織項目。將它分解成子系統和庫,這些子系統和頭文件頭向系統其餘部分提供有用的有限接口,同時保持庫/子系統/模塊內部的實現細節。