3

我的同事只是让我帮忙解决一个问题,他的代码中有几行

for (long counter = 0; counter < End; )
{
  ...
  assert(counter++ < MAX);
  ...
}

问题是,当我们使用 Visual Studio 逐行调试时,assert() 行似乎一直被跳过,并且counter从未递增,因此循环从未完成。

当我们使用 VS 查看反汇编时,没有这个 assert() 函数的组装线。我以前从未使用过 assert(),所以我想知道这是否正常,他不应该将任何代码行为放入 assert() 中,或者调试器或其他有什么问题?

谢谢。

4

5 回答 5

6

确保未定义,因为NDEBUG仅在调试构建中启用,即未定义时。assertNDEBUG

这里

#ifdef NDEBUG
#define assert(condition) ((void)0)
#else
#define assert(condition) /*implementation defined*/
#endif

也就是说,whenNDEBUG被定义assert为无操作,这是您在汇编中观察到的。

于 2012-07-24T17:39:33.387 回答
4

您应该只将 assert 用于调试目的。

线

assert(counter++ < MAX);

包含逻辑,它不应该。

在非调试版本中,它永远不会被执行。

于 2012-07-24T17:40:45.960 回答
3

assert is a macro, which is removed in release builds. So unless you're looking at a debug build, don't expect to see any assert code.

And because assert is a macro, and not a function, it's not likely to look like a single function call either.

于 2012-07-24T17:40:01.000 回答
1

断言通常会从发布版本中删除,因此仅在调试版本中执行。你不应该有任何副作用影响断言中的程序逻辑。

于 2012-07-24T17:40:24.447 回答
1

如果代码是在发布模式下构建的,则不会包含断言语句。您的同事是否在使用发布模式?

Visual Studio 的优化设置也可能会删除断言语句。

您的同事不能将 for 循环更改为不使用 assert 语句吗?

于 2012-07-24T17:45:52.853 回答