8

2つのCファイル1.cと2.cがあります

2.c

#include<stdio.h>

static int i;

int func1(){
   i = 5;
   printf("\nfile2 : %d\n",i);
   return 0;
}

1.c

#include<stdio.h>

int i;

int main()
{
   func1();
   printf("\nFile1: %d\n",i);
   return 0;
}

「gcc1.c2.c-ost」で両方のファイルをコンパイルしました。出力は次のとおりです。

file2 : 5

File2: 0

次のような出力を期待していました

file2 : 5

File2: 5

両方のファイルで同じ変数「i」にアクセスしたい。どうすればいいですか?

4

4 に答える 4

15

変数を格納するファイルを 1 つ選択します。使用しないでくださいstatic。全体のポイントはstatic、変数を非公開にし、他のモジュールが触れないようにすることです。

他のすべてのファイルでは、externキーワードを使用して変数を参照します。

extern int i;
于 2012-10-04T13:34:10.490 に答える
6

別のファイルの静的変数にアクセスする理由はありません。static キーワードを使用している理由がわからないようです。ファイル スコープ (関数の外) で変数を宣言する方法は 2 つあります。

グローバル変数

int i;

利点:

  • プログラムの実行全体を通して有効です。

短所:

  • externでアクセスして、スパゲッティ コードを作成できます。
  • グローバル名前空間を「汚染」します。
  • スレッドセーフではありません。
  • プログラムの起動時に初期化されるため、プログラムのオーバーヘッドが発生します。

ローカル/プライベート変数

static int i;

利点:

  • プログラムの実行全体を通して有効です。
  • 同じ「モジュール」/「翻訳単位」(同じ .c ファイル) 内のファイルからのみアクセスできます。
  • 呼び出し元がアクセスできないため、プライベート カプセル化を提供します。

短所:

  • スレッドセーフではありません。
  • プログラムの起動時に初期化されるため、プログラムのオーバーヘッドが発生します。

私の個人的な意見では、グローバル変数や extern キーワードを使用する理由は決してないということです。私は 15 年以上プログラミングをしてきましたが、どちらも使用する必要はありませんでした。私はリアルタイムの組み込みシステムから Windows GUI のふわふわアプリまですべてをプログラミングしてきましたが、どのような形式のアプリケーションでもグローバル変数を使用する必要はありませんでした。さらに、既知のほぼすべての C コーディング標準で禁止されています。

于 2012-10-04T14:05:09.250 に答える
1

static変数は、単一の翻訳単位内でのみアクセスできます。つまり、変数が定義されているファイル内のコードのみが参照できます。ウィキペディアの記事には素晴らしい説明があります。この場合、変数を複数のファイルで共有するには、extern.

于 2012-10-04T13:40:29.123 に答える