スポンサーリンク

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

スポンサーリンク