2つのファイル(モジュール)file1.c, file2.cに分割された下のようなプログラムについて考えます。
モジュールfile1.cで定義された大域的スコープを持つ変数globalを、モジュールfile2.c内の関数で使用するためには、以下の例のようにextern宣言を用います。
以下のプログラムの場合は、変数globalは file2.c中の関数test2()でのみ使用されており、test3()では使用されていません。
できるだけスコープを小さく抑えるために、変数globalは関数test2() 内でのみ使用可能であるようにしたいのですが、さて、file2.cにどのような変更を加えたらよいでしょうか?
- (a)プログラムリスト file1.c
/* file1.c */ #include <stdio.h> int global; int test1(void); extern int test2(void); extern int test3(void); int main(void) { int i, k; global = 10; i = test1(); printf("%d\n",i); i = test2(); printf("%d\n",i); i = test3(); printf("%d\n",i); } int test1(void) { int i; global += 10; i = global + 2; return(i); }
- (b)プログラムリスト file2.c
/* file2.c */ extern int global; int test2(void); int test3(void); int test2(void) { int j; global += 20; j = global + 3; return(j); } int test3(void) { int k; k = 2; return(k); }
- (c)解答の一例
- 変数globalの外部宣言を、関数test2()内部に移せばよい。
プログラムリスト file2a.c
/* file2a.c */ int test2(void); int test3(void); int test2(void) { extern int global; int j; global += 20; j = global + 3; return(j); } int test3(void) { int k; k = 2; return(k); }