9

-O2 -Wall フラグを gcc (4.4.6) に追加した後、警告からコードを削除しました。一部のレガシー コードには多くの警告があります。これは、問題を示すための非常に単純化されたバージョンです。

 1 #include <cstdio>
  2
  3 bool init(bool& a)
  4 {
  5     return true;
  6 }
  7
  8 int main()
  9 {
 10     bool a;
 11
 12     if (!init(a))
 13     {
 14         return 1;
 15     }
 16
 17     if (a)
 18     {
 19         printf("ok\n");
 20     }
 21 }

「gcc main.cpp -O2 -Wall」としてコンパイルすると、次のように表示されます。

 main.cpp:17: warning: `a' is used uninitialized in this function

実際のコードでは、init() は "a" を初期化する場合にのみ true を返すため、初期化されていない "a" は実質的に使用されません。

警告を修正するためにできること。

4

4 に答える 4

13

に変更bool a;するbool a = false;と、この警告が削除されます。

コンパイラinit(a)は、「a を初期化する」ことを意図していることを知りません。プログラムが初期化されていない変数を使用して関数を呼び出そうとしていることだけを認識します。

于 2013-10-15T05:54:58.563 に答える
7
int main()
{
    bool a = false;
    ...

常にすべての変数を初期化してください。

于 2013-10-15T05:55:04.677 に答える
2

-Wno-uninitialized をコンパイル オプションに追加します。

于 2013-10-15T06:07:55.890 に答える