我有一个函数dangerous(GEN x)
,我的代码中经常调用它,其中GEN
是typedef
。出于调试目的,我想将checkSafe
添加到此函数的所有实例中,例如
#ifdef DEBUG
#define dangerous(x) GEN __x = (x); if(checkSafe(__x)) dangerous(__x)
#endif
但我担心这可能无法按预期运作。做这样的事情的正确方法是什么?该功能经常用于单独检测每个用途,因此不希望检查外部调试模式(出于各种原因)。
答案 0 :(得分:3)
需要注意的事项/小心:
解决方案:将原始功能重命名为_dangerous
。
if
中,只有一条语句:if (foo) dangerous(x);
else
的{{1}}:if
if (foo) dangerous(x); else bar();
。 解决方案:将宏包含在GEN __x = 5; dangerous(__x);
等结构中。
do { ... } while(0)
是typedef,这可能不是问题)。最后,您可能还想在checkSafe失败时投诉,例如通过记录错误消息,甚至中止程序。
将上述内容放在一起,您可以像这样检测功能:
GEN
#ifdef DEBUG
#define dangerous(x) do { \
GEN __x = (x); \
if (checkSafe(__x)) \
_dangerous(__x); \
else \
complainAbout(__x); \
} while(0)
#else
#define dangerous _dangerous
#endif
返回您要使用的值(例如dangerous()
)。解决方案:定义一个函数来检测原始函数并传递返回值:
int