2010-06-25 156 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

相关问题