2

extern次のコードでキーワードを使用する必要があるのはなぜですか。

header.h

float kFloat; // some say I should write 'extern float kFloat;', but why?

file.c

#include <stdio.h>
#include "Header.h"

float kFloat = 11.0f;

main.c

#include <stdio.h>
#include "Header.h"

int main(int argc, const char * argv[])
{
    printf("The global var is %.1f\n", kFloat);

    return 0;
}

このコードは機能します。グローバル変数 kFloat のデフォルトは、外部リンケージと静的ライフタイムです。

出力は次のとおりです。

グローバル変数は 11.0 です

どのような場合に問題が発生するのかわかりません。クラッシュする例を誰か教えてもらえますか?

4

5 に答える 5

8
extern float kFloat;

kFloat定義せずに宣言します。

しかし:

float kFloat;

も宣言してkFloatいますが、 の暫定的な定義ですkFloat

追加するexternと、暫定的な定義が抑制されるだけです。ヘッダー ファイルでは、定義ではなく、宣言のみが必要です。

暫定的な定義が複数のソース ファイルに含まれている場合、C では未定義の動作である同じオブジェクトの複数の定義を持つことになります。

于 2013-10-05T14:31:29.007 に答える
3

常にグローバル変数の定義float kFloat;( など) を .c ファイルに入れ、宣言( などextern float kFloat;) をヘッダーに入れます。

そうしないと、複数の .c ファイルに同じヘッダーが含まれている場合に、複数定義エラーが発生します。

于 2013-10-05T14:32:07.090 に答える
2

まず、コードがコンパイルされているのは奇妙です。kFloatの変数の二重定義に対してコンパイル時エラーをスローする必要がありますFile.c

次に、2 つのファイルで共通変数を使用しようとしている場合は、header.h. を含むファイルが外部で定義されていることを認識externできるように、ヘッダー ファイルでキーワードを使用する必要があります。header.h

これで、任意の c ファイルで変数をグローバルに定義し、その変数を共通変数として使用できるようになりました。

于 2013-10-05T14:36:28.173 に答える
2

extern使用するプロジェクト内 (または関数ブロックの外) のどこかに変数が定義されていることを示します。これは他の場所で定義されていることをコンパイラに伝えているため、メモリを割り当てません。

変数は、プログラムのモジュールの 1 つで 1 回定義する必要があります。定義がないか複数ある場合は、おそらくリンク段階でエラーが発生します。

定義とは、変数が作成される場所またはストレージが割り当てられる場所を指します。宣言は、変数の性質が述べられているが、ストレージが割り当てられていない場所を指します。

また、他の場所からアクセスできるため、静的である必要があります。

于 2013-10-05T14:31:08.237 に答える
2

extern ... を使用する必要があるのはなぜですか?

まあ、あなたはすべきではありません。簡潔でシンプル。externグローバル変数を使用するべきではなく、キーワードが必要なのはグローバル変数だけだからです。

グローバル変数を使用したくなったら、もう一度考え直してください。絶対最大で、(キーワードを使用して) ファイル スコープで変数を使用する必要がある場合がありますstatic。通常、そのような変数には、その値を操作/使用する少数の関数が伴いますが、変数自体は、ファイルのスコープ。グローバル変数の使用は、大量のバグを導入せずに変更することはほとんど不可能な、手に負えないほど複雑なコードにつながるだけです。

于 2013-10-05T14:50:38.690 に答える