pen*_*ope 7 c++ debugging assert
我的代码中的一些断言刚开始表现得很奇怪,我想知道是否有人之前有过类似的情况.一个简短的代码片段,如:
#include <cassert>
class A{
protected:
bool isM, isN;
public:
void someFunction();
};
A::someFunction(){
assert (this->isM && this->isN);
...
}
Run Code Online (Sandbox Code Playgroud)
产生一个assertion failed
结果.另一方面,稍微更改代码后:
A::someFunction(){
assert(this->isM);
assert(this->isN);
...
}
Run Code Online (Sandbox Code Playgroud)
断言通过没有问题,函数正常完成.函数正常完成是预期的功能,因为bool
变量是在实际调用之前设置的someFunction()
.
另外一个问题是,有没有更好的方法在C++中进行断言?我在C上长大,我仍在使用C风格的断言.我刚刚在谷歌的表面划了一下,但没有发现什么暗示有什么新东西.
哦,如果需要,我可以为类和变量提供更多的上下文,如果这还不足以让任何人认识到有问题的情况.该bool
变量在子类的实例了实际设定的,而someFunction
在实施了罕见的功能之一class A
接口,但由于这个问题复杂化,我只会更详细,如果社会认为它相关的编辑.
布尔值未初始化。它们可以取任何值。这里的行为是未定义的。为了说明这一点,在 ubuntu 11.10 上使用 gcc 4.7 快照:
#include <iostream>
struct A {
bool a, b;
};
int main() {
A a0;
std::cout << a0.a << ", " << a0.b << "\n";
A a1;
std::cout << a1.a << ", " << a1.b << "\n";
}
Run Code Online (Sandbox Code Playgroud)
产生这个输出:
121, 0
244, 31
Run Code Online (Sandbox Code Playgroud)
或者,再次运行,
192, 0
244, 127
Run Code Online (Sandbox Code Playgroud)
或者,用-O3
一堆零进行优化。