「C言語/データ型と変数の高度な話題」の版間の差分

削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
→‎typedef: cleanup
タグ: 2017年版ソースエディター
Ef3 (トーク | 投稿記録)
→‎extern: ヘッダーに外部参照宣言を分離し、定義側でも読み込む。
タグ: 2017年版ソースエディター
78 行
externを使うことで、複数のソースファイルで、1つの識別子を共有することができる。
 
//例 ;externの使用例
<syntaxhighlight lang="C">
:;myheader.h:<syntaxhighlight lang="C">
//例 externの使用例
#ifndef H_MYHEADER
#define H_MYHEADER
extern int i; //外部結合をもつ。
extern void function(void); //外部結合をもつ。このexternは省略可能。
 
#endif
//file1.c
</syntaxhighlight>
:;file1.c:<syntaxhighlight lang="C">
#include <stdio.h>
#include "myheader.h"
 
int main(void) {
extern int i;//外部結合をもつ。
i = 1;
extern void function();//外部結合をもつ。このexternは省略可能。
printf("最初のiの値は%d。\n", i);
 
function();
int main(void)
printf("function関数を呼び出した後のiの値は%d。\n", i);
{
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">
//例 externの使用例
 
//file2.c
int i;
 
void function(void) { i = 2; }
{
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 で使う時は、宣言と定義の食い違いのリスクを負っていることを意識すべきです。
上の例では、file1.cとfile2.cとでiとfunction()をそれぞれ共有している。
 
----