外部変数

グローバル変数は、そのモジュール内ならどこでも参照、代入が可能な変数であった・・・。
では、別のモジュールからその変数を参照したり、代入したりする場合はどうすればいいのか?

このような場合は、参照したい別モジュールで、参照したい変数をexternをつけて再宣言すればいい・・・。
このような変数を外部変数と呼ぶ・・・。

今回は、extern_variable_1.cとextern_variable_2.cという2つのモジュールを用意して、互いに外部変数を参照する・・・。

extern_variable_1.cの関数宣言は、

func1はこのモジュールextern_variable_1.cにて定義する・・・。
しかし、func2はextern_variable_2.cという別のモジュールで定義している・・・。
実は、関数もモジュール外部から参照できるのだが、externは省略していいということになっている・・・。
なので、func2も普通の関数宣言に見える・・・。

同様に、extern_variable_2.cも

func1を外部から参照している・・・。

extern_variable_1.cに戻って、

global_variable_1は、ここのグローバル変数なので、そのまま宣言・・・。
global_variable_2は、extern_variable_2.cのグローバル変数なので、externをつけて宣言・・・。

extern_variable_2.cも、global_variable_1を外部から参照している・・・。

これで、どちらの関数もグローバル変数も、どちらからもアクセスできるようになった・・・。

extern_variable_1.cにあるfunc1の定義は、

global_variable_2を出力、global_variable_2に200を代入、global_variable_1に30を代入・・・。

extern_variable_2.cにあるfunc2の定義は、

global_variable_1を出力、global_variable_1に20を代入、global_variable_2に100を代入となっている・・・。

でmain関数は、

global_variable_1を10、global_variable_2を0に初期化しておき、func2、func1を読んだ後、それぞれの値を出力する・・・。

2つのモジュールを一気にコンパイル&リンクするには、

$ gcc -o extern_variable extern_variable_1.c extern_variable_2.c

こうする・・・。
で、実行すると、

$ ./extern_variable
global_variable_1(in func2) = 10
global_variable_2(in func1) = 100
global_variable_1 = 30
global_variable_2 = 200
$

となる・・・。

最初はglobal_variable_1が10、global_variable_2が0・・・。
func2でglobal_variable_1が出力される・・・。つまり10・・・。
このあと、global_variable_1は20、global_variable_2は100になる・・・。
func1では、global_variable_2が出力・・・。つまり100・・・。
このあと、global_variable_2は200、global_variable_1は30になる・・・。
で残りの2つが出力される・・・。

Sample/extern_variable_1.c at master · bg1bgst333/Sample · GitHub
Sample/extern_variable_2.c at master · bg1bgst333/Sample · GitHub