2017-07-31 4 views
0

使用されていないすべての静的const変数に対して未使用変数警告が表示されないのはなぜですか? 私は簡単なコードを用意しました。 main.cppとincl.hの2つのファイルがあります。未使用の静的const変数のすべてではなく、未使用の警告が発生する

incl.h

#ifndef INCL_H 
#define INCL_H 

struct A 
{ 
    static A& instance() 
    { 
     static A a; 
     return a; 
    } 
}; 

static const A a = A::instance(); 
static const A& b = A::instance(); 

#endif 

main.cppに

#include "incl.h" 

int main() 
{ 
    return 0; 
} 

Iは、(aおよびb fariables用)2未使用変数の警告が存在するであろうことを期待は、実際に警告のみです1つは変数bです。

$ g++ -std=c++11 -Wall -Wextra -O2 -c main.cpp 
In file included from main.cpp:1:0: 
incl.h:14:17: warning: ‘b’ defined but not used [-Wunused-variable] 
static const A& b = A::instance(); 

しないのはなぜ変数同じ警告の原因?

+0

私はあなたがどんなクラスタイプでも同じ現象を見ると思います。 – molbdnilo

+0

使用しているg ++のバージョンは? – Jonas

+0

@Jonas、g ++のバージョンは5.4.1です –

答えて

1

変数の場合、シングルトンインスタンスは代入によって変数にコピーされるため、使用されていると主張できます。

+0

さて、コピーによって作成されるため、変数aが使用されていることを確認しましょう。変数bの定義を "static const A&b = a;"に変更することを提案します。この場合、警告は一切ありません。 varible bはどこにありますか?また、静的const A a = A();で変数を作成することもできます。また、警告はありません。 –

+0

私はそれがコンパイル時の最適化のために起こると思います。コンパイラがオブジェクトの作成を認識し、その変数が使用されていない場合、コンパイラはそれを削除します。そのため、警告が表示されない場合は、変数が保持され、警告が生成されます。しかし、それは私の想いです。あなたはそれについてどう思いますか? –

関連する問題