「Think in C++」を読んでいて、extern
宣言が導入されました。例えば:
extern int x;
extern float y;
意味(定義なき宣言)は分かると思いますが、いつになったら役に立つのでしょう。
誰かが例を提供できますか?
「Think in C++」を読んでいて、extern
宣言が導入されました。例えば:
extern int x;
extern float y;
意味(定義なき宣言)は分かると思いますが、いつになったら役に立つのでしょう。
誰かが例を提供できますか?
これは、グローバル変数がある場合に役立ちます。ヘッダーでグローバル変数の存在を宣言して、ヘッダーをインクルードする各ソース ファイルがそれを認識できるようにしますが、ソース ファイルの 1 つで一度だけ「定義」する必要があります。
明確にするために、 usingは、呼ばれるextern int x;
型のオブジェクトがどこかに存在することをコンパイラに伝えます。それがどこに存在するかを知るのはコンパイラの仕事ではありません。それを使用する方法を知るために、型と名前を知る必要があるだけです。すべてのソース ファイルがコンパイルされると、リンカは、コンパイルされたソース ファイルの 1 つで見つかった 1 つの定義へのすべての参照を解決します。これが機能するためには、変数の定義に「外部リンケージ」と呼ばれるものが必要です。これは基本的に、関数の外側 (通常は「ファイル スコープ」と呼ばれるもの) で、キーワードなしで宣言する必要があることを意味します。int
x
x
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;
これは、グローバル変数が必要な場合に便利です。一部のソース ファイルでグローバル変数を定義し、ヘッダー ファイルで extern を宣言して、そのヘッダー ファイルをインクルードするすべてのファイルが同じグローバル変数を参照できるようにします。