回答:
これは、グローバル変数がある場合に役立ちます。ヘッダー内のグローバル変数の存在を宣言して、ヘッダーを含む各ソースファイルがそれを認識できるようにしますが、ソースファイルの1つで一度定義するだけで済みます。
明確にするために、using extern int x;
は、int
呼び出されたタイプのオブジェクトx
がどこかに存在することをコンパイラーに伝えます。それがどこにあるかを知るのはコンパイラの仕事ではなく、タイプと名前を知っている必要があるだけなので、それをどのように使用するかを知っています。すべてのソースファイルがコンパイルされると、リンカーはx
、コンパイルされたソースファイルの1つで見つかった1つの定義へのすべての参照を解決します。それが機能するためには、x
変数の定義に「外部リンケージ」と呼ばれるものが必要です。つまり、基本的には、関数の外(通常「ファイルスコープ」と呼ばれるもの)で、static
キーワードなしで宣言する必要があります。
#ifndef HEADER_H
#define HEADER_H
// any source file that includes this will be able to use "global_x"
extern int global_x;
void print_global_x();
#endif
#include "header.h"
// since global_x still needs to be defined somewhere,
// we define it (for example) in this source file
int global_x;
int main()
{
//set global_x here:
global_x = 5;
print_global_x();
}
#include <iostream>
#include "header.h"
void print_global_x()
{
//print global_x here:
std::cout << global_x << std::endl;
}
いくつかのモジュール間で変数を共有する場合に役立ちます。1つのモジュールで定義し、他のモジュールでexternを使用します。
例えば:
file1.cpp内:
int global_int = 1;
file2.cpp内:
extern int global_int;
//in some function
cout << "global_int = " << global_int;
global_int
れている場合、グローバル名前空間にある場合、何か問題がありますか?私がそれを正しい名前空間セクションのfile2.cppで使用した場合、スコープを正しく設定する必要がありますか?ienamespace XYZ{ void foo(){ ::global_int++ } };
abc.h
場合、それがで定義される可能性が高くなりますabc.cpp
。優れたIDEは常に役に立ちますが、よく整理されたコードは常により良いソリューションです。
extern
file2.cppになくても、インクルードglobal_int
後にアクセスできます。なぜそれが必要なのですか?
それはすべてリンケージについてです。
以前の回答は、についての適切な説明を提供しましたextern
。
しかし、私は重要なポイントを追加したいと思います。
あなたは尋ねるextern
でC ++ではないにCや無応答の場合についての言及はありませんなぜ私は知りませんextern
が付属していますconst
C ++には。
C ++では、const
変数にはデフォルトで内部リンケージがあります(Cとは異なります)。
したがって、このシナリオではリンクエラーが発生します。
ソース1:
const int global = 255; //wrong way to make a definition of global const variable in C++
ソース2:
extern const int global; //declaration
次のようにする必要があります。
ソース1:
extern const int global = 255; //a definition of global const variable in C++
ソース2:
extern const int global; //declaration
extern
が定義なしで同じであることを確認できますか?あなたは、の値をプリントアウトすることにより、それを行うことができglobal
、ソース2に
extern
に省略されていますconst int global = 255;
。
extern
いくつかの場面で定義を提供しなければなりませんでした。Microsoftツールは、別のソースファイルのテーブルが定義されているだけの場合、欠落したシンボルのリンクエラーを生成しました。問題は、テーブルがconst
あり、C ++コンパイラがそれをstatic
変換単位に昇格させたことです。たとえば、ariatab.cpp
とを参照してくださいkalynatab.cpp
。