extern
extern宣言:
他ファイルからのアクセスを可能とするための宣言。
外部のファイルに変数が定義されていますよということ。
※「extern」を付けた変数定義は「定義」ではなく「宣言」という扱い
変数がメモリに実体化されない。
extern宣言に初期化をすると、エラーになる。
例:extern int gNumber=0; //これだとエラーになる。
例:
下記 sub.cで作成されているgNumberというグローバル変数をmain.cで使用したい場合、
extern int gNumber; を入れる事により、main.cで使用可能となる。
code:c
//main.cファイル
//ファイルのインクルード
#include <stdio.h>
extern int gNumber; // extern宣言
//メイン処理
int main(void)
{
func(); //func関数の実行
printf("gNumber : %d\n", gNumber); //gNumberの数値を表示 (gNumber:200)
return 0;
}
code:c
//sub.cファイル
int gNumber = 100; // グローバル変数
void func(void)
{
gNumber += 100; //gNumberに100追加
}
実行結果:https://paiza.io/projects/Mcdzg7P9IqdN8u5JPWtsOA
これが、下記のように、extern宣言していないとエラーになる。
code:c
//main.cファイル
//ファイルのインクルード
#include <stdio.h>
//extern int gNumber; // extern宣言
//メイン処理
int main(void)
{
func(); //func関数の実行
printf("gNumber : %d\n", gNumber); //gNumberの数値を表示 (gNumber:200)
return 0;
}
code:c
//sub.cファイル
int gNumber = 100; // グローバル変数
void func(void)
{
gNumber += 100; //gNumberに100追加
}
実行結果:https://paiza.io/projects/iMsDbW31xMdfo3NiqLunww
sub.cのグローバル変数をmain.cで使用しなければ、エラーには、ならない。
code:c
//main.cファイル
//ファイルのインクルード
#include <stdio.h>
//extern int gNumber; // extern宣言
//メイン処理
int main(void)
{
func(); //func関数の実行
return 0;
}
code:c
//sub.cファイル
int gNumber = 100; // グローバル変数
void func(void)
{
gNumber += 100; //gNumberに100追加
printf("gNumber : %d\n", gNumber); //gNumberの数値を表示 (gNumber:200);
}
実行結果:https://paiza.io/projects/4A2dN0thUh1ASLv6Mek9og
上記プログラムでは、.cファイルにextern宣言を書いてあるが、本来なら、ヘッダファイル(.hファイル)に書く。
ただ、グローバル変数は、開発上意図しない変更が起こってしまうため、グローバル変数に、extern宣言を使うことは殆どない。
また、現在のC言語では、extern宣言しなくても、問題なく使用できる。
ヘッダファイルを使用したextern宣言
code:c
//main.cファイル
#include <stdio.h>
#include "sub.h"
int main(void)
{
func();
printf("gNumber : %d\n", gNumber);
return 0;
}
code:c
//sub.cファイル
int gNumber = 100; // グローバル変数
void func(void)
{
gNumber += 100;
}
code:c
//sub.hファイル
#ifndef SUB_H
#define SUB_H
extern int gNumber; // extern宣言
#endif
実行結果:https://paiza.io/projects/_0dq3SqSlJFKUAkQkUqv9Q
関数:
https://paiza.io/projects/oSNAUjGRybW9EF1GDReSjw?language=c
確認:
https://paiza.io/projects/n8ABWNsB6zalMfV2ZOuepA?language=c
参考:https://monozukuri-c.com/langc-funclist-extern/
https://9cguide.appspot.com/20-02.html
複数
https://paiza.io/projects/9VDztiqazozpUJ4fKxug_w?language=c