私は「Think in C++」を読んでいますが、その中でextern
宣言が紹介されていました。例えば:
extern int x;
extern float y;
意味は理解しているつもりですが(定義のない宣言)、それがいつ役に立つのか疑問に思います。
誰か例を挙げてもらえますか?
ベストアンサー1
これは、グローバル変数がある場合に便利です。ヘッダーでグローバル変数の存在を宣言すると、ヘッダーを含む各ソース ファイルがそれを認識しますが、ソース ファイルの 1 つでそれを 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
ソース1:
#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();
}
ソース2:
#include <iostream>
#include "header.h"
void print_global_x()
{
//print global_x here:
std::cout << global_x << std::endl;
}