回答:
これは、グローバル変数がある場合に役立ちます。ヘッダー内のグローバル変数の存在を宣言して、ヘッダーを含む各ソースファイルがそれを認識できるようにしますが、ソースファイルの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は常に役に立ちますが、よく整理されたコードは常により良いソリューションです。
externfile2.cppになくても、インクルードglobal_int後にアクセスできます。なぜそれが必要なのですか?
それはすべてリンケージについてです。
以前の回答は、についての適切な説明を提供しましたextern。
しかし、私は重要なポイントを追加したいと思います。
あなたは尋ねるexternでC ++ではないにCや無応答の場合についての言及はありませんなぜ私は知りませんexternが付属していますconstC ++には。
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。