以下にいくつかのスコープを用いた例を示します。この例では、test1.cは主モジュール、test2.cは従モジュールになっています。
プログラムのビルドは、例えばgcc(UNIX)、あるいはLSI-C/86試食版(MS-DOS)の場合、gcc -o test test1.c test2.cなどとすれば良いでしょう。lcc -o test.exe test1.c test2.c
さて、このプログラムの出力はどのようになるのでしょうか?
- (a)プログラムリスト test1.c
/* test1.c */ #include <stdio.h> int k; /* 大域変数 k、有効範囲はプログラム全体 */ int test1(int i); int test2(int i); int main( void ) { int i, j; /* 局所変数i,j、有効範囲はmain関数内のみ */ i = 10; k = 4; j = test1 (i); printf("%d\n", j); j = test2 (i); printf("%d\n", j); } int test1(int m) /* 局所変数 m、有効範囲はtest1関数内のみ */ { return( m + 5 + k ); }
- (b)プログラムリスト test2.c
/* test2.c */ #include <stdio.h> extern int k; /* 大域変数 k、他のモジュールで宣言した大域変数を */ /* 参照するために extern をつける */ static int m = 3; /* 大域変数 m、staticをつけると、このモジュール */ /* 内のみのスコープをもつ */ int test2(int n); int test2(int n) /* 局所変数 n、有効範囲はtest2の関数内のみ */ { return( n + 10 + k + m ); }
- (c)結果
- ※実際にプログラムを実行して確かめてみよう。
- ※ソースプログラム test1.c のダウンロード / test2.c のダウンロード(Shift-JIS形式)