2014-04-30 55 views
1

在C中,可以使用\字符將預處理程序語句擴展到多行。切斷預處理程序行

#define SWAP(a, b) {     \ 
         a ^= b;   \ 
         b ^= a;   \ 
         a ^= b;   \ 
        } 

這會蔓延宏出了幾行,但有沒有辦法剪線的微距關閉之前結束了嗎?即:我想在與宏相同的行編寫代碼,但不希望它成爲宏的一部分。例如,是否有辦法做到以下幾點?

#include <stdio.h> (some character here to end macro) int main(int argc, const char **argv) { return 0; } 

有沒有辦法合法地放置在同一行的預處理語句和main函數(或任何其他代碼)?

+0

宏預處理器是相當機械的,沒有辦法將它短路。抱歉。也就是說,沒有什麼可以阻止您將代碼放在與上述代碼相同的行上。 –

+3

你爲什麼要這麼做? C足夠神祕而沒有去追求單線......這可能是一個半可信的理由,但這不是一個明智的理由。 –

+0

有更好的方法來編寫[IOCCC](http://ioccc.org)條目。 – devnull

回答

8

不,不是你在你的問題中特別提到的#include聲明。而且,雖然我沒有特別檢查(a),但這可能是所有預處理指令的情況。

該標準規定的換行符是語法的一個組成部分(從C11 6.10.2 Source file inclusion):

形式# include <h-char-sequence>new-line...

可以地方的預處理指令#include指令之後發表的評論,因爲在第3階段發生了用單個空間替換評論,而預處理g指令在階段4中處理(請參閱C11 5.1.1.2 Translation phases)。

但是,這並不能幫助你試圖將非註釋,如main()函數定義放在同一行,這仍然是一個禁忌。

但我的問題是:爲什麼要在地球上做這個?只需輸出兩行,並完成它。它不象我們痛苦的換行符一個全球性的短缺:-)


(一)喬納森·萊弗勒已經檢查,所以這種說法是幾乎肯定是正確的。

根據ISO/IEC 9899:2011,§6。10個預處理指令:

# if恆定表達新行組選擇
# ifdef標識符新行組選擇
# ifndef標識符新行組選擇
# elif常數-expression新行組選擇
# else新行組選擇
# endif新行
# includePP-令牌新行
# define標識符替換列表新行
# defineidentifier lparen identifie R級選擇)替換列表換行
# define標識LPAREN ...)替換列表換行
# define標識LPAREN標識符表,...)替換列表新 - 線
# undef標識符新行
# linePP-令牌新行
# errorPP-令牌選擇新行
# pragmaPP-令牌選擇新行
#新線的線的

+0

這是否意味着我可以添加'\ n'來模擬新行。例如'#include \ n int main(int argc,const char ** argv){return 0; }由於註釋部分的格式,這兩行之間的分隔純粹是巧合。應該閱讀爲一行 –

+0

@Brian,沒有。首先,轉義序列在階段5中轉換。其次,這隻在字符常量和字符串文字中完成。 – paxdiablo

2

第一非白色字符爲宏絕爲#並且宏一直延伸到行結束(行結合後\個字符)。所以你不能「切斷預處理器行」。

如果你想爲一些瘋狂的詭計答案做這個,你可以在編譯過程中更好地使用-D/D(它永遠適用)並完全避免宏。

一個健全的編程要求永遠不會需要任何這樣的功能。

+1

不幸的是,在我漫長的職業生涯中,我發現理智的要求非常重要:-) – paxdiablo