C++ でグローバル変数を宣言する方法

胡金庫 2023年10月12日
  1. C++ の単一ソースファイルでグローバル変数を宣言する
  2. C++ の複数のソースファイルでグローバル変数を宣言する
C++ でグローバル変数を宣言する方法

この記事では、C++ でグローバル変数を宣言する方法をいくつか解説します。

C++ の単一ソースファイルでグローバル変数を宣言する

すべての関数の外側にあるステートメントでグローバル変数を宣言することができます。この例では、int 型の変数を想定し、任意の値 123 に初期化します。グローバル変数は、main 関数のスコープや、その内部の任意の内部構造体(ループや if 文)からアクセスすることができます。global_var の変更は main ルーチンの各部分からも見ることができます。

#include <iostream>

using std::cout;
using std::endl;

int global_var = 123;

int main() {
  global_var += 1;
  cout << global_var << endl;

  for (int i = 0; i < 4; ++i) {
    global_var += i;
    cout << global_var << " ";
  }
  cout << endl;

  return EXIT_SUCCESS;
}

出力:

124
124 125 127 130

一方、追加の関数も同じソースファイル内で定義されている場合、global_var の値に直接アクセスして、関数スコープ内で変更することができます。また、グローバル変数は const 指定子を使って宣言することもできます。

#include <iostream>

using std::cout;
using std::endl;

int global_var = 123;

void tmpFunc() {
  global_var += 1;
  cout << global_var << endl;
}

int main() {
  tmpFunc();

  return EXIT_SUCCESS;
}

出力:

124

C++ の複数のソースファイルでグローバル変数を宣言する

あるいは、異なるソースファイルで宣言されたグローバル変数があり、アクセスや変更が必要な場合もあります。この場合、グローバル変数にアクセスするには extern 指定子で宣言する必要があります。

#include <iostream>

using std::cout;
using std::endl;

int global_var = 123;
extern int glob_var1;  // Defined - int glob_var1 = 44; in other source file

void tmpFunc() {
  glob_var1 += 1;
  cout << glob_var1 << endl;
}

int main() {
  tmpFunc();

  return EXIT_SUCCESS;
}

場合によっては、異なるソースファイル内に static 指定子で宣言されたグローバル変数があるかもしれません。これらの変数は定義されているファイル内でのみアクセス可能で、他のファイルからはアクセスできません。現在のファイルで extern で宣言しようとすると、コンパイラエラーが発生します。

#include <iostream>

using std::cout;
using std::endl;

int global_var = 123;
extern int
    glob_var2;  // Defined - static int glob_var2 = 55; in other source file

void tmpFunc() {
  glob_var2 += 1;
  cout << glob_var2 << endl;
}

int main() {
  tmpFunc();

  return EXIT_SUCCESS;
}
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook