static変数のスコープは、宣言したファイル内となる
static変数のスコープはファイル内となりますが、
サンプルコードで確認してみます。
まず、main.cにg_numをstatic変数として宣言します。
初期化も同時に行います。
$ cat main.c
#include <stdio.h>
#include "func1.h"
static int g_num = 9;
int main(){
printf("main : g_num=%d\n", g_num);
func1();
printf("main : g_num=%d\n", g_num);
return 0;
}
func1.cにもg_numをstatic変数として宣言します。
$ cat func1.c
#include <stdio.h>
#include "func1.h"
static int g_num = 1;
void func1(){
printf("func1: g_num=%d\n", g_num);
g_num = 10;
return;
}
ヘッダファイルになります。
$ cat func1.h #ifndef FUNC1_H #define FUNC1_H void func1(); #endif
コンパイルして実行してみます。
func1.cのfunc1()の中で、最後にg_num = 10 としましたが、
func1()を抜けたあと、main.cのmain()では、g_numは9となってprintf出力されています。
static変数のスコープが、ファイル内だと確認できました。
$ gcc -o sample main.c func1.c $ ./sample main : g_num=9 func1: g_num=1 main : g_num=9
extern宣言したグローバル変数も確認
extern宣言したグローバル変数も確認してみます。
参考:[c言語]extern宣言してグローバル変数を使ったサンプルコード
$ cat main.c
#include <stdio.h>
#include "func1.h"
int g_num = 9;
int main(){
printf("main : g_num=%d\n", g_num);
func1();
printf("main : g_num=%d\n", g_num);
return 0;
}
g_numをextern宣言します。
$ cat func1.c
#include <stdio.h>
#include "func1.h"
extern int g_num;
void func1(){
printf("func1: g_num=%d\n", g_num);
g_num = 10;
return;
}
ヘッダファイルです。
$ cat func1.h #ifndef FUNC1_H #define FUNC1_H void func1(); #endif
コンパイルして実行してみます。
func1.cのfunc1()の中で、最後にg_num = 10 としましたが、
func1()を抜けたあと、main.cのmain()で、g_numが10となってprintf出力されています。
2つのファイル間で、g_numが参照されているのが確認できました。
$ gcc -o sample main.c func1.c $ ./sample main : g_num=9 func1: g_num=9 main : g_num=10
