-- 変数宣言とスコープ1 --
変数は宣言される場所により参照できる範囲が異なります。
例えば以下の2つのファイルに分割してソースを書いた場合、staticキーワードとexternキーワードによる動作の差を見てみます。
-------- value.c -------
int extintval=0;
static int stintval=0;
void setval(int n) {
stintval=n;
}
int readval( ) {
return stintval;
}
------------------------
-------- vmain.c -------
#include <stdio.h>
extern int extintval;
void setextval() {
extintval=20;
void setval(int n);
int readval( );
int main() {
setval(10);
printf("%d\n",readval());
setextval();
printf("%d\n",extintval);
printf("%d\n",++extintval);
return(0);
}
------------------------
この例では、実態の変数宣言を行っているvalue.cと変数を参照するvmain.cからなっている。
value.cをコンパイルすると生成されるオブジェクトに実質的な変数領域が確保される、それを参照するために2つの方法がとられている
一つは、静的変数(static変数)を外部別のファイルから参照するために関数を利用して変数を操作する方法です。static変数は宣言されているファイルの中からしか参照・操作することが出来ない変数であるため外部から変数を操作するために関数を用意する必要があります。
もう一つは外部変数(external変数)と呼ばれる変数で参照する前にextern 変数名; という宣言を行ったうしろのソースで操作が可能になります。ただしextern で宣言できる変数名は必ず実態が存在する変数名になります。
このソースではvalue.cの先頭にあるint extintval=0;が実態の変数宣言です。
また、このように複数ファイルにソースを分割することで、作ったプログラムを共有して使うことが可能になります。これを分割コンパイルといいます。