G++ 标志以防止使用未初始化的继承属性
Posted
技术标签:
【中文标题】G++ 标志以防止使用未初始化的继承属性【英文标题】:G++ flag to protect against use of uninitialized inherited properties 【发布时间】:2021-02-18 15:26:34 【问题描述】:我怎样才能让 g++ 保护我不使用未初始化的父属性到子构造函数中?
struct A
A(int typ): typetyp
const int type;
;
struct B : public A
B(int typ): A(type)
;
int main()
B b3;
return 0;
你能看到这里的错误吗,它有多棘手?
这里我们构建了一个B
的实例,以3
作为参数,我们期望type
的值为A
是3
,对吧?但是我们在B
构造函数中输入错误,我们没有将接收到的参数的内容传递给A
,而是将值的内容传递给A::type
。在B
构造函数中查看typ
与type
的区别。
那么我怎样才能让 g++ 温暖我呢?因为它不应该被允许,A
尚未初始化,我们不应该能够访问 A
属性。
【问题讨论】:
不是警告,但是如果你给构造函数参数与成员同名,那么构造函数参数将被使用,因为它隐藏了父类成员。-Wuninitialized
: compiler-explorer.com/z/5rMPah
@NathanOliver 确实如此,但这就是我说输入错误的原因
我明白了,但是如果它们的名称相同,那么打字错误就会变成编译器错误(名称不存在),而不是静默编译。
@dyp 它似乎不起作用,标志对我没有任何作用,你知道原因吗?
【参考方案1】:
要使用的标志是-Wuninitialized
,它已经嵌入了-Wextra
和-Wall
。
但就我而言,我在 c++14 模式下使用 gcc-6.4。 使用这个 gcc 版本,您必须使用标志,启用优化并使用已使用未初始化变量初始化的变量。 只有当所有这些条件都已完成时,gcc 才会警告您使用了未初始化的变量。
您可以在这里看到:https://compiler-explorer.com/z/q53sYr - 如果我删除 -O2
标志或 b.type
上的最后一个条件,gcc 不会警告我们。
正如手册页所说 (https://man7.org/linux/man-pages/man1/g++.1.html):
请注意,可能没有关于变量的警告 仅用于计算本身从未使用过的值, 因为这样的计算可能会被数据流删除 在打印警告之前进行分析。
【讨论】:
嗯,关于未使用参数的警告也是一个很好的提示……以上是关于G++ 标志以防止使用未初始化的继承属性的主要内容,如果未能解决你的问题,请参考以下文章