2009-06-12 87 views
6

我們希望使我們的C++大括號風格更加一致。現在,我們的代碼包含的混合:重新格式化C++大括號不改變縮進?

if (cond) 
{ 
    // ...  
} 
else 
{ 
    // ... 
} 

...和:

if (cond) { 
    // ... 
} else { 
    // ... 
} 

我們要單獨使用,後者的風格。

但是,我們不要想改變我們的代碼的縮進。我嘗試過使用astyle,bcpp,GNU indent和Uncrustify(並且我已經查看了GreatCode的命令行選項)。不幸的是,這些工具中的每一個都堅持重新加載我們的代碼,並且大部分工具都非常糟糕地破壞了C++構造函數初始化器列表和預處理器宏。

是否有任何C++代碼的美化而只留下壓痕,可以解決大括號?它不一定是一個預先存在的工具 - 如果你知道如何使用一些瘋狂的Perl單線程來做到這一點,那也很好。謝謝!

更新:是的,我們意識到這會使難以閱讀針對舊代碼的差異。這是一個長期推遲的代碼清理,我們已經決定,格式一致性的日常優勢勝過任何版本控制困難。

+0

你們都出汗的小東西。 – 2009-06-12 15:01:53

回答

7

這裏有一個Perl的一行應該做你想做的。

perl -pi.bak -e 'BEGIN { undef $/; } s/\s*?(\s?\/\/.*)?\r?\n\s*{/ {\1/g; s/}(\s?\/\/.*)?\r?\n\s*else\b(.*)/} else\2\1/g;' 

原來此:

int main(int argc, char *argv[]) 
{ 
    int something = 0; 
    if (something) // 5-12-2007 
    { 
     printf("Hi!\n"); 
    } 
    else // 5-13-2007 
    { 
     printf("Bye\n"); 
    } 
    return 0; 
} 

成這樣:

int main(int argc, char *argv[]) { 
    int something = 0; 
    if (something) { // 5-12-2007 
     printf("Hi!\n"); 
    } else { // 5-13-2007 
     printf("Bye\n"); 
    } 
    return 0; 
} 
3

你真的應該三思而後行,大概三次,在此之前。它會徹底摧毀你的源代碼控制系統的修訂歷史。你正在使用源代碼控制系統,不是嗎?

+0

也許我很厚,但我不明白。我看到的唯一問題是在更改之前和之後區分文件會導致很多差異。我不明白「它會完全破壞你的源代碼控制系統的修訂歷史」。 – Glen 2009-06-12 12:24:14

+3

準確地說 - 很多差異 - 如果使用短方法,可能在每隔一行。這將使差異無用 - 您將無法從重新格式化所產生的噪音中挑出真正的變化。 – 2009-06-12 12:26:18

+2

嗯,你是對的。它不會完全破壞您的修訂歷史記錄。它只會摧毀您將受影響的新代碼與更改邊界上的舊代碼進行比較的能力。這對您或您的項目可能或可能無關緊要。 – kmarsh 2009-06-12 12:27:26

1

豈不盡顯簡約regexs的手做的伎倆?喜歡 (\)。 ?\ n。?\ {) - >(\)\ {)刪除右括號和開大括號之間的空格。

2
perl -ei '$/=undef;while(<>){s/}\s*?(\s*\/\/^[\r\n]*)?\r?\n\s*else/} else$1/gm;s/(\s*\/\/[^\r\n]*)?\r?\n\s*{/ {$1/gm;print;}' yoursourcefile.cpp 

該第一軋液機} <eol> <whitespace> else} else,然後刪除結束線從<eol> <whitespace> {

若要將此到源代碼樹,使用findxargs:先運行一些工具的astyle一樣做我們想要的95%,這樣的

find . -name \*.cpp -print0 | xargs -0 perl -ei '$/=undef;while(<>){s/}\s*?(\s*\/\/^[\r\n]*)?\r?\n\s*else/} else$1/gm;s/(\s*\/\/[^\r\n]*)?\r?\n\s*{/ {$1/gm;print;}' 
0

我已經解決的問題,在過去,然後在結果上編寫Perl或Python腳本來完成剩餘的5%。試試吧,瞭解你的正則表達式總是一個好習慣。 :)