2011-11-10 8 views
1

私は静的に配列を作成し、それを他の翻訳単位で参照したいと考えています。それからそれをstatic int array[100] = {...}と定義し、他の翻訳単位でextern int array[]と宣言します。しかし、コンパイラは静的クラスと外部クラスの記憶クラスが互いに矛盾していると私に伝えます。1つの静的変数を複数の翻訳単位と共有するにはどうすればよいですか?

+0

"あなたはアレイを静的にする"必要があると決めたのはいつですか? –

+1

@KerrekSB私は、大部分の人は、グローバルな 'static'変数はクラス変数' static'を作ることや、関数 'static'にローカル変数を作ることと同じことを意味すると思います。それは分かりやすい間違いですが、そんなことはほとんどありません。 –

+0

http://stackoverflow.com/questions/4615192/why-does-the-static-keyword-have-so-many-meanings-in-c-and-c –

答えて

11

staticを削除します。 1つの.cppファイルにint array[100] = {...};があり、ヘッダーファイルにextern int array[100];があります。

staticは、他の翻訳単位では認識できないことを意味します。明らかにそれはexternと矛盾します。

2

static(ファイルスコープ内)は、かなりアセンブラの宣言専用ディレクティブです。これは、クラスまたは関数スコープ内でstaticと最も確かに異なっています。

など。 zlibでは#define LOCAL staticが使用されます。

+3

何と一緒に何をするのですか?あなたは "リンカー"を意味しましたか? –

+1

いいえ、アセンブラ。アセンブラはシンボルテーブルを作成します。私は特定の 'gcc -c'と同様のものはリンカーを伴わない。 – moshbear

+1

私は参照してください。いずれにしても、言語標準には「アセンブリ段階」はなく、「リンケージタイプ」のみ:-) –

2

変数をグローバルにする代わりに、静的にしてパブリックアクセサーと修飾子を追加することを検討してください。他のモジュールの裸の変数に直接結びつけるのは素晴らしいことではありません。

関連する問題