我的同事刚刚让我帮忙解决问题,他的代码中有几行
for (long counter = 0; counter < End; )
{
...
assert(counter++ < MAX);
...
}
问题是,当我们使用Visual Studio逐行调试时,似乎一直跳过assert()行,并且counter
永远不会增加,因此循环永远不会完成。
当我们使用VS查看反汇编时,此assert()函数没有装配线。我之前从未使用过assert(),所以我想知道这是正常的,他不应该将任何代码行为放入assert()或者调试器或其他地方出现错误?
感谢。
答案 0 :(得分:6)
确保NDEBUG
未定义,因为assert
仅在调试版本中启用,即未定义NDEBUG
时。
来自here:
#ifdef NDEBUG
#define assert(condition) ((void)0)
#else
#define assert(condition) /*implementation defined*/
#endif
也就是说,当定义NDEBUG
时,assert
是no-op,这是你在汇编中观察到的。
答案 1 :(得分:4)
您应该仅将assert用于调试目的。
该行
assert(counter++ < MAX);
包含逻辑,它不应该。
在非调试版本中,它永远不会被执行。
答案 2 :(得分:3)
assert
是一个宏,在发布版本中删除。因此,除非您正在查看调试版本,否则不要期望看到任何assert
代码。
因为assert
是一个宏,而不是一个函数,所以它不太可能看起来像一个函数调用。
答案 3 :(得分:1)
断言通常会从发布版本中删除,因此仅针对调试版本执行。在断言中,你不应该有任何影响程序逻辑的副作用。
答案 4 :(得分:1)
如果代码是在Release Mode下构建的,则不会包含assert语句。您的同事是否使用发布模式?
Visual Studio的优化设置也可能会删除断言语句。
您的同事难道不能将for循环更改为不使用assert语句吗?