2017-07-26 19 views
0

これは簡単なことですが、私はC++の専門家ではありません。私はこの問題を解決するかもしれないいくつかの基本的なコーディング構造が欠けていると思っています。 FooはPODクラスです静的constクラスでは定義されていませんが使用されていません

static const Foo INVALID_FOO = {}; 

(それはC++ 03のプロジェクトに組合に使われているとして、それは、コンストラクタを持っていません):私は私のメインのヘッダファイルのいずれかで、次の定義を持っています。これは、ヘッダを含むが、私は警告を取得しています、INVALID_FOOを使用していないソースを除き、罰金だ:私はstaticを削除しようとしましたが、その後、私は重複定義を取得

error: 'Foo::INVALID_FOO' defined but not used [-Werror=unused-variable] 

。これを前方宣言にして.cファイルで定義することもできますが、コンパイラは参照によってアクセスする必要があり、最適化を行うことができません。私はまた、-Wallコンパイラフラグを無効にしたくないです。これを行うには良い方法があるのでしょうか?

+1

C++ 17の '' inline'ingが助けになるのだろうか? – Bathsheba

+0

あなたは* INVALID_FOOを各翻訳単位*(https://en.wikipedia.org/wiki/Translation_unit_(プログラミング))ごとに定義しますか?ヘッダーファイルに*宣言し、ソースファイル(実際に使用されている場所)に定義しておくのはなぜでしょうか? –

+0

@Someprogrammerdude:ちょうどそれに基づいて答えに "あなたの答えを投稿"することをほとんど押すが、私はOPがそれを認識しているという印象を持っている。 – Bathsheba

答えて

3

あなたはこのような警告GCCを抑制することができる:unusedはそれがないすべてはそれが警告を抑制し(そしてそれは、識別子を参照するために、まだ大丈夫です)ということで、ここでは正しいことを

static const Foo INVALID_FOO __attribute__ ((unused)) = {}; 

注意。 used属性もあります。は、コンパイラがほとんどの場合、ソースコード内で参照を参照しなくてもGCCにオブジェクトファイルの定義を出力するよう指示します。

+0

ありがとう、これは私が探していたものです。 – blackghost

+1

小さな修正 - '__attribute __((未使用))'が '='の前に来なければなりません。そうでなければ、コンパイルエラーが発生します( 'expected、or; __attribute __ ''の前)。 gccバージョンのものかもしれません... – blackghost

+0

C++ 17では、標準の[[maybe_unused]] '[attribute](http://en.cppreference.com/w/cpp/language/attributes)を使用することもできますGCCは 'maybe_unused'をまだ認識していないので' '[[gnu :: unused]] 'となります。 –

0

static_cast<void>(INVALID_FOO);ステートメントを使用して、警告を移植可能に抑制することができます。

はまた、グローバルな名前空間スコープでstatic constがトートロジーのビットであることに注意してください - staticは不要であるようにconstが、それstaticになります。

関連する問題