我刚刚在一些代码中挖出了一个错误,我们正在使用*因以下情况而失败:
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代码奴隶,我们的任务是破解,削减,剃须,擦亮,消毒并涂上口红。
答案 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
,则会被忽略)。