extern

C & C++ 관련 : 2007. 12. 6. 11:50
반응형

extern 은 외부에서 전역변수로 사용할때 사용 됩니다. 저건 지역 변수구요 차라리 할거면 함수 안에서만 사용하실려면 static을 사용하세요 06.12.04 22:10

 C언어를 조금 능숙하게 다루기 시작하면 보통 한 파일에 모든 내용을 다 넣지 않습니다. 여러개의 파일로 나눠서 쓰곤하죠... 이때 쓰는 키워드가 extern입니다. main.h 파일에 전역변수로 a를 선언 해두고... main.h 파일을 include해서 쓰는 모든 종류의 *.c 파일에서는 main.h의 전역변수 a를 사용할수 있어야 되겠죠... 만약 main.c 파일에서 main.h를 include해서 쓴다면 main.c에서 extern int a; 라고 선언 해줘야 합니다. extern을 빼 버리면 링크 하는 과정에서 동일한 변수명이 발견되어 에러가 생기고, extern int a;을 아예 빼버리면 main.c파일 자체가 컴파일 안되죠... 설명이 맞나 몰긋네요.. ^^;; 잘 안써본 거라서 말이죠...  06.12.05 14:18

컴파일러마다 약간씩 틀리긴 하지만.. 기본적으로 extern으로 선언하면 실제 메모리상에 변수가 올라가는것이 아닙니다. 이 변수가 어딘가에 선언되어 있으니 '찾아라' 이 정도의 의미입니다. 사용에 주의하시기 바랍니다..  06.12.05 23:01

extern은 변수나 함수의 이름이 전역(외부에서 정의되어 아무데서나 참조될 수 있는)임을 컴파일러에게 알리는(선언) 데 사용됩니다. extern이 없으면, 당연히 변수를 만드는(정의) 것입니다. 선언은 컴파일러에게 이름의 자료형을 알리는 것입니다. 선언되지 않은 이름을 사용하면 컴파일러는 해석할 수 없습니다. 사실 #include <파일> 을 먼저 하는 가장 큰 이유이죠. 정의는 메모리를 할당하여 변수의 실체를 만드는 과정입니다. 따라서 사용한다면 반드시 정의되어 있어야

아래와같은 프로그램이 있는데..

이것을 header, source로 나누어 쪼개라는데..

도대체 하는 방법과..

어떻게 extern을 쓰는 건지 잘 모르겠어서..

이렇게 도움을 요청합니다..

아시는 분 있으시면 제발 답변 부탁합니다..

------------------------------------------------------------------


#include "stdio.h"

#define MAX_TERMS 101

typedef struct term {
int col;
int row;
int value;
}term;

void transpose(term c[],term d[]);

void main()

{

term a[MAX_TERMS];

term b[MAX_TERMS];
int i;
a[0].row=6;a[0].col=6;a[0].value=8;
a[1].row=0;a[1].col=0;a[1].value=15;
a[2].row=0;a[2].col=3;a[2].value=22;
a[3].row=0;a[3].col=5;a[3].value=-15;
a[4].row=1;a[4].col=1;a[4].value=11;
a[5].row=1;a[5].col=2;a[5].value=3;
a[6].row=2;a[6].col=3;a[6].value=-6;
a[7].row=4;a[7].col=0;a[7].value=91;
a[8].row=5;a[8].col=2;a[8].value=28;

transpose (a,b);

for(i=0;i<=8;i++)
printf("%3d", b[i].row);
printf("\n");

for(i=0;i<=8;i++)
printf("%3d", b[i].col);
printf("\n");

for(i=0;i<=8;i++)
printf("%3d", b[i].value);
printf("\n");
}



void transpose(term a[],term b[])
{
int n,i,j,currentb;
n=a[0].value;
b[0].row=a[0].col;
b[0].col=a[0].row;
b[0].value=n;

if(n>0){
currentb=1;
for(i=0;i for(j=1;j<=n;j++)
if(a[j].col==i){
b[currentb].row=a[j].col;
b[currentb].col=a[j].row;
b[currentb].value=a[j].value;
currentb++;
}
}
}




하나의 소스파일을 main.h main.c transpose.c 로 나누어 보겠습니다.
define과 struct선언을 main.h에 했고, transpose()는 transpose.c에 두고,

main.c에서 extern으로 선언해서 사용했습니다.


// main.h     /////////////////////////////////////////

#define MAX_TERMS 101

typedef struct term {
     int col;
     int row;
     int value;
}term;

/////////////////////////////////////////////////////////


// main.c      ///////////////////////////////////////

#include <stdio.h>

#include "main.h"

extern void transpose(term c[],term d[]);

void main()

{

...

...

}

/////////////////////////////////////////////////////////////////


// transpose.c      ///////////////////////////////////////

#include <stdio.h>

#include "main.h"

void transpose(term a[],term b[])

{

...

...

}

////////////////////////////////////////////////////////////////////////



 

반응형

'C & C++ 관련' 카테고리의 다른 글

변수 형태,extern  (0) 2007.12.06
#difine과 typedef 와 const 의 정의와 예제줌  (0) 2007.10.22
Character Set과 Font  (0) 2007.10.20
Posted by Real_G