1

私のプログラムにはconstants.h、グローバルスコープで次のマトリックスを宣言するというファイルがあります(マトリックスは完全に一定である必要があります。潜在的な問題が発生した場合は、お知らせください)。

static unsigned char const MY_MATRIX[66][9] = {...};

別のファイルで、それを呼び出しましょうmain.c。実際にこの定数を参照できます。

doSomething(var1, count, MY_MATRIX[42], TRUE, FALSE, thing);

staticしかし、キーワードの定義を読んだだけで、定義されているファイルの外部から変数にアクセスできないことを意味しているはずです(この場合、望ましい動作はアクセスする必要があるということですが、キーワードは次のように見えます使用するもの!)extern

それで、なぜこれが機能するのか誰かに教えてもらえますか?変数が見えないのはなぜですか?ありがとう!

4

4 に答える 4

4

これはstatic、ヘッダーで変数を宣言しているためです。ヘッダーをCファイルに含めると、他の定義から独立したまったく新しい定義が得られます。ヘッダーを2つのファイルに含めると、2つの独立したコピーが得られます。これを3つのCファイルに含めると、3つの独立したコピーが得られます。static定義によってリンカーからコピーが隠されるため、コピーは互いに競合しません。

静的メモリに割り当てられた共有データを利用する適切な方法はextern、ヘッダーで宣言を行い、1つのCファイルに非静的定義を追加することです。

于 2012-12-16T16:12:45.650 に答える
2

ヘッダーにある場合は、それを含めるすべての単一のソースファイルで定義されます(ただし、各ソースファイルには独自のインスタンス化があり、同じものにはアクセスしません)。

于 2012-12-16T16:12:30.607 に答える
1

staticキーワードには、次の2つの用途があります。

  • 関数ブロック内の静的変数は、後続の呼び出し間でその値を保持します。
  • 静的グローバル変数または関数は、宣言されたファイルでのみ「表示」されます。

ここでは、ヘッダーファイルでマトリックスを定義しているため、そのヘッダーファイルを含むすべての.cファイルに表示されます。表示を制限するには、代わりに.cファイルで定義してください。

于 2012-12-16T16:17:15.703 に答える
0

通常、静的変数がヘッダーファイルで宣言されている場合、そのスコープは.hファイルに限定されず、ヘッダーファイルのスコープとは異なります。翻訳ユニットには、ヘッダーファイルのテキストがソースファイルに含まれています。したがって、ヘッダーファイルを含むすべての変換ユニットは、静的スコープですが、独自の個別の変数を取得します。

于 2012-12-16T16:31:51.047 に答える