「C言語/データ型と変数の高度な話題」の版間の差分
削除された内容 追加された内容
→typedef: cleanup タグ: 2017年版ソースエディター |
→extern: ヘッダーに外部参照宣言を分離し、定義側でも読み込む。 タグ: 2017年版ソースエディター |
||
78 行
externを使うことで、複数のソースファイルで、1つの識別子を共有することができる。
<syntaxhighlight lang="C">▼
:;myheader.h:<syntaxhighlight lang="C">
▲//例 externの使用例
#ifndef H_MYHEADER
#define H_MYHEADER
extern int i; //外部結合をもつ。▼
extern void function(void); //外部結合をもつ。このexternは省略可能。▼
#endif
</syntaxhighlight>
▲:;file1.c:<syntaxhighlight lang="C">
#include <stdio.h>
#include "myheader.h"
int main(void) {▼
▲extern int i;//外部結合をもつ。
▲extern void function();//外部結合をもつ。このexternは省略可能。
▲int main(void)
▲ i=1;
▲ printf("最初のiの値は%d。\n", i);
▲ function();
▲ printf("function関数を呼び出した後のiの値は%d。\n", i);
}
</syntaxhighlight>
:;file2.c:<syntaxhighlight lang="C">▼
#include "myheader.h"
▲<syntaxhighlight lang="C">
int i;
void function(void) { i = 2; }
</syntaxhighlight>
;実行結果:<syntaxhighlight lang="bash">
% cc file1.c file2.c -o prog
% ./prog
最初のiの値は1。
function関数を呼び出した後のiの値は2。
</syntaxhighlight>
上の例では、myheader.h で外部参照宣言を一括して行い、定義元の file2.c でも myheader.h をインクルードしています。
この事により、宣言と定義で方が食い違っていないことを言語処理系が検査する機会を与えています。
extern を、.h でなく .c で使う時は、宣言と定義の食い違いのリスクを負っていることを意識すべきです。
----
|