我想用一些样板代码包装一些代码行,所以我应该通过传递多行代码作为宏参数来实现它,如下所示:
#define safeRun(x) if (ValidationOK()) {x}
int main(int argc, char **argv) {
safeRun(
foo();
bar();
)
}
非常感谢。
答案 0 :(得分:5)
如上所述,您的代码将与逗号运算符一起运行(但不像之前声称的那样,在函数参数列表中使用逗号)。
假设您使用C99,您甚至可以避免宏中的变量参数问题:
#define safeRun(...) if (ValidationOK()) {__VA_ARGS__}
int main(int argc, char **argv) {
safeRun(
foo(a, b),
bar(c, d);
)
}
现在,就预处理器而言,宏有两个参数,用逗号分隔,但它们可以根据需要进行处理。这是gcc -E
输出:
# 1 "x3.c"
# 1 "<command-line>"
# 1 "x3.c"
int main(int argc, char **argv) {
if (ValidationOK()) {foo(a, b), bar(c, d);}
}
你提议的是一个好主意是一个单独的讨论;这些机制或多或少会使其发挥作用。
答案 1 :(得分:1)
使用\
字符“转义”宏定义中的换行符。使用可变参数宏参数来支持包含代码行的参数内的逗号。 (此功能是C99的一部分,但也存在于许多不合规的编译器中。)
#define safeRun(...) \
[Validation code]; \
if (ValidationOK()) \
{__VA_ARGS__} \
[Finishing code]; \
/* bumper line to support last backslash, leave empty! */
请注意,反斜杠和换行符之间不能有空格。
标准警告:宏是封装的最漏洞形式;如果可能的话,使用任何其他构造。
答案 2 :(得分:0)
由于多种原因,类似函数的宏非常糟糕。解决这个问题的一个更好的方法是使用实际函数。
start_safe();
foo();
bar();
stop_safe();
答案 3 :(得分:0)
正如@Potatoswatter所说,你可以使用反斜杠:
#define safeRun(x) \
[Validation code]; \
if (ValidationOK()) \
{x} \
[Finishing code]; \
但如果以这种方式使用它,这可能会成为一个问题:
if (x)
safeRun(y);
else
...
解决问题:
#define safeRun(x) \
do { \
[Validation code]; \
if (ValidationOK()) \
{x} \
[Finishing code]; \
} while(0);