7

我想用一些样板代码包装一些代码行,所以我应该通过将多行代码作为宏参数传递来做到这一点,如下所示:

#define safeRun(x) if (ValidationOK()) {x} 

int main(int argc, char **argv) {
    safeRun(
        foo();
        bar();
    )
}

非常感谢。

4

4 回答 4

8

如所写,您的代码将与逗号运算符发生冲突(但如前所述,函数参数列表中的逗号不会)。

假设您使用 C99,您甚至可以在宏中使用可变参数来规避这个问题:

#define safeRun(...) if (ValidationOK()) {__VA_ARGS__}

int main(int argc, char **argv) {
    safeRun(
        foo(a, b),
        bar(c, d);
    )
}

现在,就预处理器而言,宏有 2 个参数,用逗号分隔,但可以根据需要处理它们。这是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);}



}

您提出的建议是否是一个好主意是一个单独的讨论;这些机制或多或少会使其发挥作用。

于 2013-01-16T07:24:58.840 回答
1

正如@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);
于 2013-01-16T07:36:14.700 回答
1

使用该\字符在宏定义中“转义”换行符。使用可变参数宏参数来支持包含代码行的参数内的逗号。(此功能是 C99 的一部分,但也存在于许多不兼容的编译器中。)

#define safeRun(...) \
[Validation code]; \
if (ValidationOK()) \
    {__VA_ARGS__} \
[Finishing code]; \
/* bumper line to support last backslash, leave empty! */

请注意,反斜杠和换行符之间不能有空格。

标准警告:宏是最泄漏的封装形式;如果可能,请使用任何其他构造。

于 2013-01-16T07:20:25.367 回答
0

由于多种原因,类似函数的宏非常糟糕。解决这个问题的更好方法是使用实​​函数。

start_safe();
  foo();
  bar();
stop_safe();
于 2013-01-16T07:30:21.467 回答