C言語において、extern宣言はグローバル変数を共有する仕組み
グローバル変数とローカル変数
#include <stdio.h> int gNumber = 100; void func(void) { gNumber += 100; } int main(void) { int tmp = 100; func(); printf("tmp : %d\n", tmp); printf("gNumber : %d\n", gNumber); }
$ gcc test.c -o test && ./test
tmp : 100
gNumber : 200
複数ファイルにする
main.c
#include <stdio.h> void func(); int main(void) { func(); printf("gNumber : %d\n", gNumber); }
sub.c
int gNumber = 100; void func(void) { gNumber += 100; }
この場合、sub.cのコンパイルは通るがmain.cのコンパイル時にgNumberが定義されていない識別子としてエラーになる。
$ gcc -c sub.c
$ gcc -c main.c
main.c: In function ‘main’:
main.c:8:30: error: ‘gNumber’ undeclared (first use in this function)
8 | printf(“gNumber : %d\n”, gNumber);
| ^~~~~~~
main.c:8:30: note: each undeclared identifier is reported only once for each function it appears in
そこでmain.cでexternで宣言する
#include <stdio.h> extern int gNumber; void func(); int main(void) { func(); printf("gNumber : %d\n", gNumber); }
$ gcc -c main.c
$ gcc main.o sub.o -o main
$ ./main
gNumber : 200