是否可以将一段代码作为宏参数传递?

mch*_*hen 4 c

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

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

int main(int argc, char **argv) {
    safeRun(
        foo();
        bar();
    )
}
Run Code Online (Sandbox Code Playgroud)

非常感谢.

Jon*_*ler 6

如上所述,您的代码将运行逗号运算符(但不像之前声称的那样,在函数参数列表中使用逗号).

假设您使用C99,您甚至可以避免宏中的变量参数的问题:

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

int main(int argc, char **argv) {
    safeRun(
        foo(a, b),
        bar(c, d);
    )
}
Run Code Online (Sandbox Code Playgroud)

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



}
Run Code Online (Sandbox Code Playgroud)

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

  • 不; 预处理器需要括号而不是大括号。不过,如果您确实愿意,可以在参数列表中使用大括号。 (2认同)