○extern



複数ソースコードをまたいで変数やメソッドを使用するときに時に使います。

全ファイル中のどれかに定義されている
宣言だけを行い定義は行わない宣言方法です



■a.cの変数や構造体、メソッドを extern を使い、b.cで使用する

▼a.c ---------------------------------------

#include <stdio.h>

int i=1;

struct Structure1{
	char *str;
} st1;

void test(char*str){
	i=10;
	st1.str ="st1\n";
	printf("%s\n",str);
}

▼b.c---------------------------------------

#include <stdio.h>

extern void test(char*);
extern void test2();
extern int i;

extern struct Structure1{
	char *str;
} st1;

int main(){
	test("test");
	printf("%d\n",i);
	printf(st1.str);
	return 0;
}





■変数をヘッダー内で定義・宣言した場合、複数のファイルでインクルードするとエラーが発生します

ヘッダーはincludeされたソースコードに展開されるために int i が重複して定義されることになりエラーになる
以下はエラーになるプログラム

▼test.h ---------------------------------------

int i;

▼a.c ---------------------------------------

#include <stdio.h>
#include "test.h"

void test(){
	printf("%d\n",i);
}

▼b.c ---------------------------------------

#include <stdio.h>
#include "test.h"

extern void test();

int main(){
	i=10;
	test();
	return 0;
}




■上のプログラムの改良版 ヘッダーでソースコード上のどこかにある変数の宣言だけしている

▼test.h ---------------------------------------

extern int i;

▼a.c ---------------------------------------

#include <stdio.h>
#include "test.h"

void test(){
	printf("%d\n",i);
}

▼b.c ---------------------------------------

#include <stdio.h>
#include "test.h"

extern void test();

int i;

int main(){
	i=10;
	test();
	return 0;
}




■ヘッダーらしくしたもの
ヘッダーをincludeしたソースファイルがコンパイルされる時にincludeされたヘッダーも各々コンパイルされます
複数回インクルードされた場合でもマクロ命令により一つしかコンパイルされないようにしています。


▼test.h ---------------------------------------

#ifndef _TEST_
#define _TEST_

extern int i;
extern void test();

#endif

▼test.c ---------------------------------------

#include <stdio.h>

int i=0;

void test(){
	printf("%d\n",i);
}

▼a.c ---------------------------------------

#include <stdio.h>
#include "test.h"

int main(){
	i=10;
	test();
	return 0;
}




■上のプログラムを修正して構造体の宣言をヘッダーで行なう
ヘッダーの中で型の宣言を行っているが定義を行なってはいけない。

▼test.h ---------------------------------------

#ifndef _TEST_
#define _TEST_

//typedefにより(bb)型を別の名前(aa)で使用できるようにする
typedef struct bb{
	char*str;
} aa;

extern void test(aa);

#endif

▼test.c ---------------------------------------

#include <stdio.h>
#include "test.h"

void test(aa a){
	printf("%s\n",a.str);
}


▼a.c ---------------------------------------

#include "test.h"

int main(){
	aa a;
	a.str ="aaa";
	test(a);
	return 0;
}







▲トップページ > Windows と C++