Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用-Os的更多警告_C++_Gcc_Compiler Construction_Warnings_Warning Level - Fatal编程技术网

C++ 使用-Os的更多警告

C++ 使用-Os的更多警告,c++,gcc,compiler-construction,warnings,warning-level,C++,Gcc,Compiler Construction,Warnings,Warning Level,这个节目 int main() { int a, b; a = b; return 0; } 如果使用编译,则编译时不会出现警告或错误 g++-Wall test.cpp 但是,如果您在编译时启用了优化,即使在相同的警告级别上也是如此 g++-Wall-Os-test.cpp 然后它会开始抱怨您使用了未初始化的变量 (注意:实际的程序稍微长一点,并且没有像这里这个小例子那样清楚地暴露问题。) 我曾尝试用谷歌搜索,但要么我没有使用正确的搜索词,要么这不是一个已知的现象。总

这个节目

int main()
{
    int a, b;
    a = b;
    return 0;
}
如果使用编译,则编译时不会出现警告或错误

g++-Wall test.cpp

但是,如果您在编译时启用了优化,即使在相同的警告级别上也是如此

g++-Wall-Os-test.cpp

然后它会开始抱怨您使用了未初始化的变量
(注意:实际的程序稍微长一点,并且没有像这里这个小例子那样清楚地暴露问题。)

我曾尝试用谷歌搜索,但要么我没有使用正确的搜索词,要么这不是一个已知的现象。总之,我的问题基本上是

  • 为什么编译器会使用-Os发出此警告,而不使用-O0发出此警告,即使警告级别相同?(如果有什么不同的话,我希望这个小例子正好相反,因为变量可以完全优化掉,然后问题就会消失。)
  • 是否有其他编译器选项会触发像这样的意外警告?因为我对使我的程序无bug感兴趣,所以我喜欢看所有的程序
  • 这是已知的特征吗?如果是,我在哪里可以找到它?我确实试过搜索
  • 或者这只是我特定版本的编译器(GCC4.3.2-1.1,Linux,32位)中的一个小故障

对于更高的优化级别,编译器会注意到您正在对未初始化的变量进行等值。警告也是如此

使用更高的优化级别时,编译器会注意到您正在对未初始化的变量进行等值。警告也是如此

编译器需要进行额外的检查才能执行一些优化,这会导致它发出额外的警告。本章相关章节对此作了简要说明

顺便说一句,在我的平台(x86上的32位ubuntu 12.04)上,代码使用gcc 4.6.3、gcc 4.7.0和gcc 4.8快照生成警告:

uninitialized.cpp:在函数“int main()”中: 未初始化。cpp:3:9:警告:变量“a”已设置但未使用[-Wunused但已设置变量] 未初始化。cpp:4:10:警告:“b”在此函数中未初始化使用[-Wuninitialized]


编译器需要进行额外的检查才能执行一些优化,这会导致它发出额外的警告。本章相关章节对此作了简要说明

顺便说一句,在我的平台(x86上的32位ubuntu 12.04)上,代码使用gcc 4.6.3、gcc 4.7.0和gcc 4.8快照生成警告:

uninitialized.cpp:在函数“int main()”中: 未初始化。cpp:3:9:警告:变量“a”已设置但未使用[-Wunused但已设置变量] 未初始化。cpp:4:10:警告:“b”在此函数中未初始化使用[-Wuninitialized]



你确定就这样吗?我的意思是,-Wall确实包括-Wuninitialized和-Wmaybe uninitialized。也许我应该读一下。@lister先生:我同意你的看法-墙上的开关打开-Wmaybe未初始化和-WUNINInitialized。但我说的是两个未初始化变量相等时的警告。但显然,这就是发生的情况。参见juanchopanza的答案,这解释了更多。但不是为什么,你确定是这样吗?我的意思是,-Wall确实包括-Wuninitialized和-Wmaybe uninitialized。也许我应该读一下。@lister先生:我同意你的看法-墙上的开关打开-Wmaybe未初始化和-WUNINInitialized。但我说的是两个未初始化变量相等时的警告。但显然,这就是发生的情况。参见juanchopanza的答案,这解释了更多。但不是原因。我确实在各种最新的GCC版本中使用您的第一个编译行收到警告,请参见下面的答案。您是否有将O级别默认为2或更高的设置?如果手动输入-O0会发生什么情况?否则,可能我的gcc版本已经过时了。但这是我的存储库附带的版本。。。我知道,我早该换一个新系统了。我明确使用了
-O0
。我确实在各种最新的GCC版本上使用您的第一行编译得到了警告,请参阅下面的答案。您是否有将O级别默认为2或更高的设置?如果手动输入-O0会发生什么情况?否则,可能我的gcc版本已经过时了。但这是我的存储库附带的版本。。。我知道,我早该买新系统了。我明确使用了
-O0
。谢谢。这一页至少说了“它只在程序经过优化编译时才起作用,所以数据流分析是启用的。”所以我知道这不仅仅是我自己。但这并不能解释为什么。为什么编译器不能在没有优化的情况下进行数据流分析?@MrLister我想这是一个优化。如果不需要,为什么要花时间去做?另一方面,人们希望
-Wall
能够涵盖这一点。不幸的是,我无法重现这个问题,以便找出启动警告所需的标志组合。我不同意“如果不需要”部分。这是需要的!在上面的程序中,无论您是否使用优化进行编译,这都是一个同样糟糕的错误,结果同样糟糕。@MrLister在这种情况下,我同意,但不幸的是,GCC上的警告和错误的定义相当反复无常。如果有墙的话,
Wall
是一个用词不当的词。我不能不同意这一点。你确实回答了我的大部分问题,而且新版本的编译器似乎能按我所希望的方式工作,所以我不能要求更多。谢谢。这一页至少说了“它只在程序经过优化编译时才起作用,所以数据流分析是启用的。”所以我知道这不仅仅是我自己。但这并不能解释为什么。为什么编译器不能在没有优化的情况下进行数据流分析?@MrLister我想这是一个优化。如果不需要,为什么要花时间去做?另一方面,人们希望
-Wall
能够涵盖这一点。不幸的是,我无法重现这个问题,以找出警告生效所需的标志组合