C++ assert()函数未在反汇编中显示

C++ assert()函数未在反汇编中显示,c++,compiler-construction,C++,Compiler Construction,我的同事刚刚让我帮他解决一个问题,他的代码中有几行代码 for (long counter = 0; counter < End; ) { ... assert(counter++ < MAX); ... } for(长计数器=0;计数器

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

for (long counter = 0; counter < End; )
{
  ...
  assert(counter++ < MAX);
  ...
}
for(长计数器=0;计数器
问题是,当我们使用Visual Studio逐行调试时,assert()行似乎一直被跳过,
计数器
从未递增,因此循环从未完成

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


谢谢。

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

发件人:


也就是说,当定义了
NDEBUG
时,
assert
不是您在汇编中观察到的op。

assert
是一个宏,它在发布版本中被删除。因此,除非您正在查看调试构建,否则不要期望看到任何
assert
代码


而且因为
assert
是一个宏,而不是一个函数,所以它看起来也不像一个函数调用

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

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

线路

assert(counter++ < MAX);
assert(计数器+++
包含逻辑,但不应该


在非调试构建中,它将永远不会执行。

如果代码是在发布模式下构建的,则不会包含断言语句。你的同事正在使用释放模式吗

VisualStudio的优化设置也可以删除断言语句


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

assert
是一个可以定义为
(void)0
的宏。您正在将副作用(
counter++
)放入
assert()
调用中,该调用99.9%的时间是作为宏实现的,在这种情况下,甚至不会在释放模式下计算其参数。您应该先执行副作用,然后对结果调用
assert()
。谢谢您的快速回答。
assert(counter++ < MAX);