assert里面的函数调用==坏?

时间:2014-12-03 13:11:06

标签: c coding-style assert

我刚刚在一些代码中挖出了一个错误,我们正在使用*因以下情况而失败:

Assert(SomeVitalFunction(foo) == OK)

这个DEBUG宏一直都是#defined:

#ifdef DEBUG
    #define Assert(x)  if((x) == 0){/*some error handling*/}
#else
    #define Assert(x)
#endif

但是当我们#undef'd DEBUG时,它会从代码中删除重要的函数调用。

我不能为我的生活弄清楚如何使用DEBUG #undef' d,并且通常将任何类型的函数调用放入其中是一个坏主意。断言这样。

我错过了什么吗?

* = 编辑以澄清以下Carpetsmoker的评论:代码来自一个特别落后的Elbonian代码奴隶,我们的任务是破解,削减,剃须,擦亮,消毒并涂上口红。

2 个答案:

答案 0 :(得分:6)

你什么都没有错过。

应始终将断言写成,只要它们在编译器开关轻弹时就会消失。

可以调用在断言内完成相对较长时间的函数(例如分析数据结构的完整性),因为函数调用不会出现在发布版本中。另一方面,无法调用正确操作所需的函数。

答案 1 :(得分:2)

这取决于SomeVitalFunction正在做什么。如果它没有有趣的副作用,可以在assert内使用它。但是,如果调用或不调用SomeVitalFunction对程序至关重要,那就是一个错误。

例如,在POSIX上,带有0信号的kill(2)仅用于测试进程是否存在。我想你有时可能会想要使用

 assert(kill(sompid, 0) == 0); // process sompid exists

假设您始终假设流程sompid仍在运行。

同样,您可以使用assert(hash_table_count(htbl)>0);检查某些哈希表htbl是否为空。

顺便说一下,如果使用-DNDEBUG预处理程序选项进行编译,请注意assert(3) 已记录被忽略(如果没有给出-DDEBUG,则会被忽略)。