2.3 例題(1)

  6.例題2-6 extern宣言
 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);
}