gcc和/或vs下是否有编译器警告来检测发起给自己的成员变量?
gcc有-Winit-self,但似乎只适用于
int f()
{
int i = i;
return i;
}
而不是
class A {
int m;
public:
A(int) : m(m) { }
int f() {return m;}
};
修改:回答问题,所有缺失的是-O1或以上(谢谢@honk)
编辑2 :实际上,问题又回到了桌面上。然而,在一个简单的例子中-O1 -Wuninitialized -Winit-self可以正常工作,它不是在你声明m(m)
而是在你定义A(4)
时捕获的。这也意味着如果构造函数在它自己的编译单元中,编译器就不会接受它(我想这应该是在现实世界的场景中)。
答案 0 :(得分:0)
在功能中执行此操作时:
int i = i;
然后我想,您可以在GCC中使用-Wuninitialized
选项,因为使用未初始化的变量i
来初始化i
。与代码中的成员变量相同。
另请注意,此代码调用未定义的行为。但是,如果您在命名空间级别对变量执行此操作,那么这是明确定义的。
答案 1 :(得分:0)
在msvc或gcc下似乎没有任何编译器标志。但是,对于gcc,valgrind会选择使用未启动的变量,这会对问题进行排序。不确定Windows的解决方案。 Visual Studio代码分析看起来可能会捡起来,但在基本版本中没有。