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