启用编译器警告以自行启动成员变量

时间:2011-12-08 17:40:42

标签: c++ compiler-construction warnings

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)时捕获的。这也意味着如果构造函数在它自己的编译单元中,编译器就不会接受它(我想这应该是在现实世界的场景中)。

2 个答案:

答案 0 :(得分:0)

在功能中执行此操作时:

int i = i;

然后我想,您可以在GCC中使用-Wuninitialized选项,因为使用未初始化的变量i来初始化i。与代码中的成员变量相同。

另请注意,此代码调用未定义的行为。但是,如果您在命名空间级别对变量执行此操作,那么这是明确定义的。

答案 1 :(得分:0)

在msvc或gcc下似乎没有任何编译器标志。但是,对于gcc,valgrind会选择使用未启动的变量,这会对问题进行排序。不确定Windows的解决方案。 Visual Studio代码分析看起来可能会捡起来,但在基本版本中没有。