2010-06-25 26 views
2

我想知道如果宏定義可以包含空間。讓我們舉例如下這個代碼:在C和C++中,我可以使用包含空格的宏定義嗎?

#define MACRO_PARAM int param2 

int function(int param1, MACRO_PARAM) 
{ 
    return param1+param2; 
} 

這適用於Visual Studio 8和gcc 3.4.5(mingw)。對我來說,這一刻足夠好,但這是標準嗎?還是我可以在不同的編譯器中依賴這種行爲?

感謝,

尤利安

PS:要回答這個問題why would you wanna do that?:我使用的一個項目野牛Flex和我試圖使一些折返(我需要聲明一些宏功能參數)。

回答

5

您需要結束每一行的定義(除了最後一個)。

+1

在我的情況下,定義只有1行,我相信它沒問題。 – INS 2010-06-25 08:48:26

+0

我將選擇此答案,因爲它提供了其他信息。謝謝 – INS 2010-06-25 08:55:03

2

是的,你可以做到這一點。

+0

這是(標準)文檔的一部分嗎? – INS 2010-06-25 08:49:18

+2

@Iulian:空間是一個非常普遍的角色。我不知道C和C++標準是否明確地說「預處理器宏可以包含空格」,但這有點像說「函數名可以包含字母'z'」。 – 2010-06-25 08:50:44

+2

+1我認爲這是一種很好的思維方式(允許有什麼不明確禁止:)) – INS 2010-06-25 08:52:29

2

是的,你可以依靠這種行爲。

3

是的,在任何遠程兼容的編譯器中,您當然可以對預處理器宏進行多字(實際上是多行)擴展。 C宏是非常討厭的,但如果他們甚至不能這麼做,那麼它們就會毫無用處。

預處理器語法可以做很多事情(足夠容易被濫用)。如果你想要或需要法律的章節和經文,請參閱標準ISO-9899(PDF)的第6.10.3節。

+0

+1 @Norman Gray:謝謝!我現在清楚地看到它是什麼意思濫用:) - 我正在潛入野牛生成的代碼。 Flex沒有任何問題,因爲它工作得很好,沒有太多的巫術。但對於野牛,我相信我釋放了宏的邪惡之神。 – INS 2010-06-25 10:35:57

相關問題