2016-01-05 67 views
4

我寫一個程序Ç預處理語句,應採取不同的基礎上,定義或沒有符號常量(S)的。舉個簡單的例子,我首先想到的是把它寫這樣的:縮進用C

#include <stdio.h> 
#define TEST 

int main(void) { 
    int num; 
    #ifdef TEST 
     num=1; 
     printf("YES\n"); 
    #else 
     num=0; 
     printf("NO\n"); 
    #endif 
    printf("%d\n", num); 
    return 0; 
} 

然而,在試圖自動縮進我的代碼(特別是通過在VIM使用gg=G)我縮進丟失:

#include <stdio.h> 
#define TEST 

int main(void) { 
    int num; 
    #ifdef TEST 
    num=1; 
    printf("YES\n"); 
    #else 
    num=0; 
    printf("NO\n"); 
    #endif 
    printf("%d\n", num); 
    return 0; 
} 

當然,如果我嘗試自動縮進像下面這樣(在兩者之間實際的命令),則會出現混亂:

#ifdef TEST1 
    commands 
    #ifdef TEST2 
     commands 
    #else 
     #ifdef TEST3 
     commands 
     #endif 
     commands 
    #endif 
#endif 

那麼,有沒有什麼我可以做的有中上面的齒列將被視爲默認值?

+0

預處理器指令不執行程序的結構,所以你不應該這樣縮進編譯conditinally(不一樣的條件代碼!)代碼。你也不應該縮小指令本身。自己'的#else的#ifdef X'被翻譯to'#elif的定義(X)' – Olaf

+0

音符。沒有必要依靠一個編輯器和恕我直言,這是一個讓懶惰的壞習慣。您不會花太多時間縮進代碼。 –

+0

是縮進你的代碼:從列剛開始1 –

回答

1

簡短的回答是:編輯器上的自動縮進遵循既定的語言指導原則,並且您正在嘗試執行的操作不被認爲是「良好實踐」,因此尚未在任何編輯器中實現(我至少見過)。

較長的答案:C語言沒有任何壓痕規則,如此作出的任何壓痕是慣例。不同的人對於他們既定慣例的理想有不同的看法。特別是對於預處理條件,我從來沒有見過任何人因使用額外的深度 - 和國際海事組織這將是不好的做法,因爲當用語言條件句混合它會得到非常混亂(即如果(代碼)) 看看這2個基本的例子:

if (conditional1) 
     action1(); 
#if compileoption1 
     else if (conditional2) 
      action2(); 
#else 
     action3(); 
#endif 

#if compileoption1 
    if (conditional1) 
#endif 
    action1(); 

變得完全不可能通過縮進遵循的邏輯。預處理器和實際編譯器是獨立的步驟,並且預處理器步驟不關注實際的C語義,因此條件可以在與C流控制語句完全正交的位置開始和結束(如果,同時,等等)。 ..),因此很難通過縮進等方式來統一它們。在我看來,爲什麼不將縮進用於預處理器條件已經成爲標準做法。 對於一些成熟的約定,請參閱內核編碼準則: https://www.kernel.org/doc/Documentation/CodingStyle

第20章討論條件編譯。