【发布时间】:2021-02-25 08:02:51
【问题描述】:
所以我有一个像这样的 marco 函数:
#define PROPOGATE_METHOD(status, function, propogationMethod) \
status = function; \
if(status != eSuccess)\
{\
propogationMethod; \
}
所以就像任何优秀的开发人员都会做的那样,我想将每个参数都包装成这样:
#define PROPOGATE_METHOD(status, function, propogationMethod) \
(status) = (function); \
if((status) != eSuccess)\
{\
(propogationMethod); \
}
但是如果我用 goto 或 return 调用这个宏函数,我会得到一个错误(预期 goto 之前的表达式)。
i.e. PROPOGATE_METHOD(status, functionCall(), goto Error;);
想解决这个问题?我正在考虑将 goto 移动到宏函数中,并环绕标签,但这会引发另一个错误:
expected identifier or ‘*’ before ‘(’ token
【问题讨论】:
-
该宏展示了宏的危险之一。尝试将它与
if (condition) PROPAGATE_METHOD(...)之类的东西一起使用,然后看到你的代码惨遭失败。 -
macro和evil密切相关。goto是到相对地址的跳转(近跳转)。您如何确保跳转地址对宏有意义? -
向我们展示您如何在最小的主函数中使用它。 TBH,我认为任何优秀的开发人员都会做的就是根本不使用这样的宏。
-
我不明白为什么这个问题会被否决。我认为这些宏是个坏主意,但我确实认为这是个好问题。
-
“就像任何优秀的开发人员都会做的那样,我想包装每个参数” - 优秀的开发人员会理解建议存在的原因、解决的问题以及最重要的问题重要的是,当它不适用时。盲目地做某事并不是好的发展。