2009-12-06 140 views
8

我很好奇,爲什麼我看到此格式,幾乎所有C宏:C宏/#定義縮進?

#ifndef FOO 
# define FOO 
#endif 

或者這樣:

#ifndef FOO 
#define FOO 
#endif 

但從來沒有這樣的:

#ifndef FOO 
    #define FOO 
#endif 

(此外, vim的=運營商似乎只把前兩個數字視爲正確。)

這是由於編譯器之間的可移植性問題,還是僅僅是一種標準做法?

回答

4

IIRC,舊的C預處理器要求#是行上的第一個字符(雖然我從來沒有真正遇到過這樣的需求)。

我從來沒有像你的第一個例子看到你的代碼。我通常會在第二個例子中編寫預處理指令。我發現它在視覺上干擾了實際代碼的縮進量(不是我用C編寫的)。

GNU C Preprocessor manual說:

預處理指令是 你的程序行以 '#' 開始。 '#'前後允許有空格。

+0

還有一些額外的刺激(如問題中提到的OP),編輯人員經常對預處理器條件塊應該如何(或不能)縮進有自己的想法。 – 2009-12-06 08:34:02

+1

舊的VAX C編譯器(大約1986年)如果預處理器指令在第一列中沒有'#',將會引發錯誤。 – 2009-12-07 21:49:47

7

我已經看到了它做了所有三種方式,這似乎是一個風格問題,而不是語法

雖然通常第二個例子是最常見的,我見過的情況下,第一(或第三個)用於幫助區分#ifdefs的多個級別。有時候邏輯可能變得深深嵌套,一眼就能理解它的唯一方法就是使用縮進,就像通常的做法一樣,在{和}之間縮進代碼塊。

1

預處理指令是我們的程序中包含的行,它們實際上並不是程序語句,而是預處理程序的指令。這些行總是以散列符號(#)開頭,在'#'之前和之後都允許有空格。只要找到換行符,預處理器指令就會結束。

關於C/C++的標準還沒有其他規則,所以它仍然是風格和可讀性問題的問題,我已經看到/編寫的程序只是以第二種方式發佈,儘管第三個似乎更具可讀性。

3

對於首選項,我使用第三種樣式,但使用第二種樣式的防護裝置除外。

我不喜歡第一種風格 - 我認爲#define是一個預處理指令,儘管當然不是,但它是#,後跟預處理指令define。但是,既然我這樣想,分開它們似乎是錯誤的。我希望倡導這種風格的人編寫的文本編輯器將有一個塊縮進/縮進,用於以該風格編寫的代碼。但我不願意使用沒有的文本編輯器來遇到它。

對於古代預處理器來說,沒有任何意義的地方,其中#必須是該行的第一個字符,除非您還可以列出這些實現與標準C之間的所有其他區別,以避免其他的事情你可能會做,他們不會支持。當然,如果你真的在使用預標準的編譯器,那就夠公平的了。