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);