0

プログラムで使用するすべての変数を格納するために、variables.hという名前のヘッダーファイルを作成します。次に、プログラムを個別のプロトタイプ.hファイルと.cファイルに切り抜きます。

変数を定義するためにvariables.cファイルを作成することにしました。variables.hにはexternキーワードがあり、cファイルには定義されています。ただし、他のcファイルに「variables.h」を含めるとエラーが発生します。 「バイナリ演算子がありません」、「var_1undefined」など。

提案??

4

1 に答える 1

1

提案があります:スコープを利用してください。

適切に作成された C プログラムが多くのグローバル変数を必要とすることはめったになく、適切に作成された C プログラムが必要とするほとんどのグローバル変数は、1 つまたは 2 つの .c ファイルによってのみ必要とされます。大規模なプログラムのすべての .c ファイルで同じグローバル変数を使用するのは意味がありません。情報の隠蔽モジュール性の利点が失われるからです。プログラムの一部を変更すると、グローバル変数に影響を与え、プログラムの残りの部分全体に影響を与えるため、プログラムは脆弱になり、変更が難しくなります。


編集: グローバル変数を回避するための提案

コードをモジュールに分割し、それぞれに 1 つのジョブを実行してから、モジュールの外部に表示されるグローバル変数に依存せずにそのジョブを実装します。グローバル変数にまったく依存しないことは、この基準にも適合し、実際に推奨されることに注意してください。また、StackOverflow の回答hereに記載されている提案も気に入っています。

プログラムをモジュールに分割する簡単な例を見てみましょう。通常、ユーザーに表示されるプログラムには、いくつかのユーザー インターフェイス ロジック、いくつかのビジネス ロジック、および場合によってはデータベース接続オーバーレイが含まれます。これらはそれぞれ、少なくとも1 つのモジュール、おそらく複数のモジュールを表しています。例として、データベースを離れて、Unix のようなプログラムを考えてみましょうwc。ファイルを読み取り、単語を数え、単語数を出力します。シンプルですね。この単純なプログラムでも、コマンドライン引数を解析してそれらの引数を構造体に入れるためのモジュールが 1 つ、単語を実際にカウントするためのモジュールが 1 つ、単語カウントを出力するためのモジュールが 1 つ必要です。ユーザー インターフェイス モジュール (この場合、main関数) は、コマンドライン引数をパーサーに渡します。パーサーは、コマンドライン引数に関する情報を含む、ヒープに割り当てられた構造体へのポインターを返します。次に、メイン モジュールは、コマンド ラインで見つかったすべてのファイル名に対して単語カウント モジュールを 1 回呼び出し、単語カウント モジュールは単語カウント情報を返します。次に、メイン モジュールが印刷モジュールを呼び出します。印刷モジュールは、コマンド ライン フラグを使用して、印刷する情報とそのフォーマット方法を決定します。

ここで、モジュールの設計が完了し、モジュールごとに 1 つ以上の .c ファイルがあるとします。必要なグローバル状態がまだある場合があります。この場合、各モジュールの .c ファイルはすべてのグローバル変数を宣言する必要があり、モジュールに複数の .c ファイルがない限り、プロジェクト全体にその変数を使用する他のファイルがあってはなりません。他の方法で。

于 2012-05-14T20:08:15.150 に答える