C言語におけるグローバル変数の再宣言の挙動を解説
本記事では、C言語におけるグローバル変数の「再宣言」がどのように扱われるのかを詳しく解説します。C言語はグローバル変数の再宣言をサポートしているのか、実際のコード例を見ながら確認していきましょう。
ローカル変数の場合:再宣言はエラーになる
まず、比較のためにローカル変数(関数内で宣言された変数)を再宣言した場合の挙動を見てみます。
コード例
#include <stdio.h>
int main(){
int a;
int a = 50;
printf("a is : %d\n", a);
}実行結果
[Error] redeclaration of 'a' with no linkage
このように、同じスコープ内でローカル変数を再宣言するとコンパイルエラーが発生します。「リンケージを持たない変数 'a' の再宣言」というエラーメッセージが出力されました。
グローバル変数の場合:未初期化なら再宣言が可能
次に、同じ操作をグローバル変数(関数の外で宣言された変数)に対して行うとどうなるか確認してみましょう。
コード例
#include <stdio.h>
int a;
int a = 50;
int main(){
printf("a is : %d\n", a);
}実行結果
a is : 50
興味深いことに、この場合はエラーにならず、プログラムは正常に実行され「a is : 50」と出力されます。つまり、初期化されていないグローバル変数であれば、再宣言(初期化を伴う宣言)が許可されるのです。
これはC言語の仕様によるもので、最初の宣言 int a; は「仮定義(tentative definition)」と呼ばれるものに該当します。仮定義は後続の定義によって補完されるため、エラーにはなりません。
初期化済みのグローバル変数を再宣言すると?
では、最初の宣言の時点ですでに値が代入されている場合はどうでしょうか。
コード例
#include <stdio.h>
int a = 10;
int a = 50;
int main(){
printf("a is : %d\n", a);
}実行結果
[Error] redefinition of 'a'
今度は「'a' の再定義」というコンパイルエラーが発生しました。すでに初期化されているグローバル変数に対して再度値を代入する形の宣言を行うと、再定義として扱われ、エラーとなります。
まとめ
C言語におけるグローバル変数の再宣言については、以下のルールが成り立ちます。
- ローカル変数:同じスコープ内での再宣言は常にエラーになる。
- グローバル変数(未初期化):最初の宣言が仮定義として扱われるため、再宣言・初期化が可能。
- グローバル変数(初期化済み):再宣言すると再定義エラーになる。
この挙動はC標準規格における「仮定義(tentative definition)」の概念に基づいています。複数のソースファイルやヘッダーファイルを扱う際にも関連してくる重要な仕様なので、しっかり理解しておきましょう。
-
Pythonのglobalキーワードとは?変数スコープの基本と使い方を実例で解説
プログラミングでは、あるスコープ内で宣言した変数の値を、そのスコープの外側から参照したり変更したりしたい場面があります。このようなときに役立つのが、Pythonのglobalキーワードです。関数内で変数名の前にglobalと記述することで、その変数をグローバル(大域)スコープとして扱えるようになります。なお、関数の外で宣言された変数は、自動的にグローバルスコープになります。 関数の外で宣言された変数 次の例では、変数は関数の外で宣言されていますが、関数の中から問題なくアクセスできています。これは、関数外で宣言された変数がすでにグローバルスコープを持っているためです。 サンプルコード x =
-
Pythonのglobalキーワードとは?変数スコープの基本と使い方を解説
Pythonプログラムでは、変数ごとに異なるスコープ(有効範囲)が存在します。変数は宣言された場所によって、関数内からアクセスできる場合とできない場合があります。ときには、現在のスコープの外側から関数内の変数を変更したいという場面も生じます。そのようなケースで活用されるのが、globalキーワードです。globalキーワードのポイント関数の外で宣言された変数は、デフォルトでグローバル変数として扱われます。関数内で宣言された変数を変更したい場合は、globalキーワードを使用します。globalキーワードを付けない場合、関数内の変数はデフォルトでローカル変数になります。globalキーワードなし