2.3 例題(1)

  2.例題2-2 いくつかのスコープを用いた例
 以下にいくつかのスコープを用いた例を示します。この例では、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形式)