2011-08-01 84 views
2

假設我有很多C++文件需要添加名稱空間聲明。即我想要文件看起來像:將命名空間聲明添加到多個文件?

//pre-processor commands and other stuff not in the namespace 
namespace foo 
{ 
    //previously existing code 
} 
//EOF 

任何方式來做到這一點,而無需手動打開每個文件?迄今爲止我所能想出的最好的方法是使用emacs宏來實現每個文件,但我仍然需要仔細閱讀每個文件。

+0

想要更改所有文件而不更改它們? –

+2

寫一段代碼來做到這一點? –

+1

這個問題不是C++相關的,也不應該標記'C++'或'namespaces'。 – bitmask

回答

4
#!/bin/bash 
for f in *.h 
do 
    line=`grep -n '^#' $f | tail -1 | cut -f1 -d:` 
    head -$line $f > tempfile 
    echo 'namespace foo {' >> tempfile 
    let line++ 
    tail --lines=+$line $f >> tempfile 
    echo '} // end namespace foo' >> tempfile 
    mv tempfile $f 
done 

這將通過在當前目錄中的頭文件,並且:

  • 找到最後預處理線
  • (以「#」開始又名線)轉儲的第一部分該文件到一個臨時文件
  • 行添加到打開的命名空間
  • 添加現有文件的其餘部分
  • 加麟E要關閉該命名空間
  • 與臨時文件替換該文件

請注意,如果你想打也cpp文件,即第一線將需要for f in *.h *.cpp。但是如果你的cpp文件有靜態函數或匿名命名空間,那麼這將不起作用。

請注意,這裏假定您的頭文件沒有經典的包含守護進行保護。它假定所有的預處理器命令都在文件的頂部。如果情況並非如此,則必須進行一些調整。試一試你的一些文件,根據需要進行調整,然後再嘗試一下。