8

私は次のことに興味があります。次のようなヘッダーファイルで宣言された単純なC配列があります。

static int userCardsIndexes[INITIAL_CARDS_NUMBER] = {0, 1, 8, 9, 16, 17};

それは私にたくさんの警告を与えます:

: 'userCardsIndexes' defined but not used

このファイルをcppファイルに含めて、この変数を使用しているにもかかわらず。私がそれについて理解していない2番目のことは、私がconstこのような指定子を追加するときです:

static const int userCardsIndexes[INITIAL_CARDS_NUMBER] = {0, 1, 8, 9, 16, 17};

警告が消えます!なぜ私がこれらの警告を受け取るのか、そしてなぜconstそれらを削除するのか、誰かが私に説明を与えることができますか?

4

2 に答える 2

16

簡単に言うと、配列を宣言するだけでなく、ヘッダーで配列を定義しているということです。これは良くない。ヘッダーを含めるたびに配列にアクセスできるようにする必要がある場合は、ヘッダーに次のような宣言が必要です。

extern int userCardsIndexes[INITIAL_CARDS_NUMBER];

次に、1つのソースファイルで、配列を次のように定義します。

int userCardsIndexes[INITIAL_CARDS_NUMBER] = {0, 1, 8, 9, 16, 17};

長い答えについて:ヘッダーファイルには「魔法のような」ものは何もありません。ディレクティブは#include基本的に、ヘッダーファイルの内容全体をソースファイルにコピーします。つまり、基本的に、取得するのは、userCardsIndexesすべてのソースファイルで定義された新しい静的配列です。この配列が使用されていない場合は、「未使用の変数」の警告が表示されます。コンパイラが未使用の変数constについて警告するように構成されていないという理由だけで、の前に付けると警告が抑制される可能性があります。const例:GCCを使用して、「-Wunused-variable」のドキュメントを参照してください。

http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html

于 2013-01-27T10:12:05.320 に答える
5

静的変数は、それらが定義されている変換単位に対してローカルです。ヘッダーでこれを行うと、それを含める各cppファイルに個別のコピーが作成されます。おそらく、必要なものではありません。コンパイラは明らかに、これらのコピーの一部がまったく使用されていないことに気づきます。

追加constすると、別の状況になります。C ++では、ファイルスコープのconstオブジェクトもデフォルトで静的です。だから、同じことconstを意味します。static const

定数配列も各cppファイルにコピーを持ちますが、とにかく常に同じ値を持つので、それはそれほど重要ではありません。

于 2013-01-27T10:10:22.600 に答える