- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
查看What's the point of g++ -Wreorder ,我完全明白 -Wreorder
有什么用。但是编译器能够检测到这样的重新排序是否无害似乎也不是不合理的:
struct Harmless {
C() : b(1), a(2) {}
int a;
int b;
};
或损坏:
struct Broken {
C() : b(1), a(b + 1) {}
int a;
int b;
};
然后我的问题是:为什么 GCC 不检测(并警告)初始化程序中未定义成员的实际使用,而不是对初始化程序的排序发出全面警告?
据我了解,-Wuninitialized
只适用于自动变量,确实没有检测到上面的错误。
编辑:
尝试将我想要的行为形式化:给定初始化器列表 :a1(expr1)、a2(expr2)、a3(expr3) ... an(exprn)
,如果(且仅当)执行任何初始化器时,我想要一个警告,按照它们将被执行的顺序,将引用一个未初始化的值。 IE。以与 -Wuninitialized
相同的方式警告使用未初始化的自动变量。
一些额外的背景:我在一家主要基于 Windows 的公司工作,基本上除了我之外每个人都使用 Visual Studio。 VS 没有此警告,因此没有人关心是否有正确的顺序(并且除了手动检查之外无法知道他们何时搞砸了顺序),因此给我留下了无尽的警告,每次有人破坏某些东西时我都必须不断修复。我只想了解真正有问题的案例,而忽略良性案例。所以我的问题可能更好地表述为:实现这样的警告/错误在技术上是否可行?我的直觉说它是,但它尚未实现的事实让我对此表示怀疑。
最佳答案
我的猜测是,这与我们使用 -Wold-style-cast
的原因相同:过于保守会导致安全错误。只要一不留神,Harmless
就会变成 CarelessMistake
。也许这个开发人员很着急,或者有一个旧版本的 GCC,或者看到它“只是一个警告”并继续。
在众多的warning中基本是这样的。它们通常是虚假的,需要进行一些重组才能干净地编译,但在某些情况下它们代表了真正的问题。如果这意味着他们得到更少的假阴性,每个优秀的程序员都会更喜欢一些工作来解决一些误报。
如果问题有一个有效的直接答案,我会感到惊讶。我认为没有技术原因无法完成。只是 。 . .为什么要费心去弄清楚有问题的事情是否真的可以呢?编程是人类的工作。
出于个人原因,我认为按照声明变量的顺序初始化变量通常是有意义的。
关于c++ - 为什么 g++ -Wreorder 不更聪明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28339137/
我正在尝试切换(某种)命令。 if 'Who' in line.split()[:3]: Who(line) elif 'Where' in line.split()[:3]: W
基本上我是在一个物理游戏中计算阻力。侧向运动需要减少(如接近 0,而不仅仅是负数),但我不知道它在哪个方向行进,所以我不知道是增加阻力还是减去阻力。 (如果一个项目向右移动,它有正向力,向左移动,负向
我有以下表格 CREATE TABLE Foos ( [Id] INT IDENTITY, -- Other fields ) CREATE TABLE Boos ( [Id]
我正在运行一个非常简单的程序 static void Main(string[] args) { Console.WriteLine(Get4S());
PHP $total_points = mysql_result(mysql_query("SELECT COUNT(*) as Num FROM account WHERE id='$id'"),0
我是一名优秀的程序员,十分优秀!