2017-10-24 13 views
1

だけで簡単な質問に宣言:グローバルに理解するために、Hファイルとそれらへのアクセス

変数extern int x_globはヘッダglob.hで宣言されています。私はこのようaginそれを定義する必要があり、この変数を使用してglob.hで宣言された関数を含むすべてのCファイルで非常に

extern void func_1(void) 
{ 
    int x_glob; 

    glob_x++; 
    return(); 
} 

は正しいですか?

x_globという宣言の外側の単語をglob.hに置いておけば、その定義は必要ありません。

なぜヘッダファイルにexternという単語を忘れていないのですか?

多分、この質問は愚かに聞こえるかもしれません - 私の目標は、プロジェクトが成長するにつれて私のプログラミングである により良い構造を得ることです。

+0

コード内の構造をよりよくしたい場合は、最初に可能な限りグローバル化を開始してください。 – Devolus

答えて

3

いいえ、これは間違っています。関数内にint x_globを指定すると、ローカルの自動変数を宣言します。これは、グローバル変数をオーバーライドします。

しかし、正確に1つの.cファイルにグローバル変数を宣言する必要があり

は:

// main.c 

int x_glob; 

これは今、すべてのモジュールで使用できる1つの変数を作成します。変数のexternバージョンは、この変数が存在する他のモジュールをコンパイルするときにのみコンパイラに通知し、モジュールを実行可能ファイルにリンクする際に検出されます。

個人的に、私は次のセットアップ好む:すべてのモジュールで

// glob.h 
#ifndef EXTERN 
#define EXTERN extern 
#endif 
EXTERN int x_glob; 

// module.c 
#include "glob.h" 

// main.c 
#define EXTERN 
#include "glob.h" 

x_globexternとして知られるであろうし、メインでそれがにexternではありませんので、グローバル変数のストレージを宣言します。

+1

"*少なくとも*" - > "*正確に*"。そうしないと、複数の定義に対してリンクが失敗するはずです。 –

+0

私の友人に感謝します - 森を見るには木が多すぎます – dagute

+0

@Dagute、そして私の答えを受け入れるために左のボタンをクリックしてください。喜んで助けになった。 –

関連する問題