如何将函数参数作为C语言宏的参数

3
我想将一个函数作为参数传递给宏,但从编译器的错误信息来看,显然我做得不对。
#define mu_run(func()) func() == 0 ? printf_green("Test passed: %s\n", #func()) : printf_red("Test failed: %s at line %d", #func(), mu_check())

我遇到的错误是:"("不能出现在宏参数列表中 #define mu_run(func()) func() == 0 ? printf_green("Test passed: %s\n", #func()) : printf_red("Test failed: %s at line %d", #func(), mu_check())
我不知道还能做什么,我尝试用没有括号的'func'替换它,但我也不确定这是否正确。

2
你需要在两个地方去掉括号:mu_run(func)#func - user3386109
2
你需要在两个地方去掉括号:mu_run(func)#func - user3386109
3
我会在整个三元表达式周围加上括号。 - user3386109
3
我会在整个三元表达式周围加上括号。 - user3386109
3
我会在整个三元表达式周围加上括号。 - undefined
1个回答

4
预处理器在处理宏时,只是简单地替换标记 - 就像将宏的声明文本复制粘贴到扩展中一样。
如果你想创建一个仅调用特定函数的宏,你可以这样做:
#define call_function(x) x()

使用call_function(foo)调用此函数会展开为foo()

您不希望:

#define call_function(x()) x()

在扩展中,()是你添加的内容(假设你想调用该函数),而不是在声明中添加。

因此,你需要删除func后面的括号,无论是在宏声明中还是在宏扩展中(当作字符串使用时):

#define mu_run(func) func() == 0 ? printf_green("Test passed: %s\n", #func) \
  : printf_red("Test failed: %s at line %d", #func, mu_check())

正如评论中所指出的,你应该将整个扩展部分用括号括起来,像这样:

#define mu_run(func) (func() == 0 ? printf_green("Test passed: %s\n", #func) \
  : printf_red("Test failed: %s at line %d", #func, mu_check()))

这将保护您免受运算符优先级可能导致的问题,例如:
mu_run(func1) && mu_run(func2)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接