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