使用自身初始化成员变量时启用编译器警告

Enable compiler warning for initiating member variables with themselves

本文关键字:启用 编译器 警告 变量 成员 初始化      更新时间:2023-10-16

在gcc和/或vs下是否有编译器警告来检测对自己初始化的成员变量?

gcc有-Winit-self,但似乎只适用于

int f()
{
    int i = i;
    return i;
}

和not for

class A {
    int m; 
public:
    A(int) : m(m) { } 
    int f() {return m;} 
};

编辑:收回问题,所有缺失的是- 01或以上(谢谢@honk)

编辑2:实际上,问题又回到了桌面上。在一个简单的例子中- 01 -Wuninitialized -Winit-self可以工作,但是,它不是在声明m(m)时捕获它,而是在定义A(4)时捕获它。这也意味着,如果构造函数在自己的编译单元中,编译器不会发现它(我认为在现实世界的场景中应该经常出现这种情况)。

当您在函数中这样做时:

int i = i;

然后我认为,您可以使用-Wuninitialized选项与GCC,因为它是使用未初始化的变量i初始化i。代码中的成员变量也是如此。

还要注意这段代码调用了未定义的行为。但是,如果您在名称空间级别对变量这样做,那么它就是定义良好的。

在msvc或gcc下似乎没有任何编译器标志。然而,对于gcc, valgrind会发现任何未初始化变量的使用,从而对问题进行分类。不确定Windows的解决方案。Visual Studio Code Analysis看起来可能会把它捡起来,但在基本版本中是不可用的。