如何使多行预处理器宏?我知道如何写一行:
#define sqr(X) (X*X)
但我需要这样的东西:
#define someMacro(X)
class X : public otherClass
{
int foo;
void doFoo();
};
我怎样才能使它工作?
这只是一个例子,实际的宏可能很长。
如何使多行预处理器宏?我知道如何写一行:
#define sqr(X) (X*X)
但我需要这样的东西:
#define someMacro(X)
class X : public otherClass
{
int foo;
void doFoo();
};
我怎样才能使它工作?
这只是一个例子,实际的宏可能很长。
Answers:
您可以将其\
用作换行符。
#define swap(a, b) { \
(a) ^= (b); \
(b) ^= (a); \
(a) ^= (b); \
}
编辑:正如@abelenky在评论中指出的那样,该\
字符必须是该行上的最后一个字符。如果不是(即使之后只是空白),您将在其后的每一行上看到令人困惑的错误消息。
` after all useful lines of the macro, and add a comment afterward saying something like
在宏. It's sometimes easier to ensure that all lines of a macro end with
`之后放置//空行,而不是确保除最后一行以外的所有行。
请注意,正如Kerrek SB和coaddict指出的(应该在公认的答案中指出的那样),请
始终在您的论点周围加括号。sqr示例是CompSci课程中讲授的简单示例。
问题出在这里:如果您以定义方式进行操作,当您说“ sqr(1 + 5)”时会发生什么?您将获得“ 1 + 5 * 1 + 5”或11
如果在其周围正确放置括号,则将#define sqr(x) ((x)*(x))
得到((1 + 5)*(1 + 5))或我们想要的36 ...美丽。
Ed S.的“交换”将有相同的问题
sqr(++i)
?(假设我们有一个int i
):)
i
随着被替换为宏而增加(在这种情况下,它被替换了两次),然后被相乘。所以sqr(++5) == ((7) * (7))
sqr(++i)
to的扩展((++i)*(++i))
将调用未定义的行为,因为i
在该语句中多次修改了的值(操作之间没有顺序点)。