본문 바로가기

UNIX_LINUX_C_C++

extern 변수를 사용하자.

unix나 linux에서 extern을써서 프로그램을짯는데 undefined오류가 나더라구요 우선 간단하게 소스를 보여 드리겠습니다.

head.h 내용

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

#include <stdio.h>

extern int a;

temp.c내용

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

#include "head.h"

void main()
{
a=2;
}


라고 짜면.

temp.c를컴파일 하면 temp.c의 a=2;요부분에서
undefined reference to 'a'라는 에러가 뜹니다.

참고로요..

1. extern을 없애면... 에러가 안나고요.

2. head.h 에서 extern int a=3;
라는 식으로 초기화를해주고
temp.c의 main에서 a=2;라는 식으로 배정문넣어주면

head.h의 extern int a=3;요부분에서 waring: 'a' initialized and declaerd 'extern'라고 워링이 뜹니다.

===========================================================================================

extern 은 "정의"하는게 아니라 "선언"하는 것이다.

주의 할것. "정의"와 "선언"은 약간 다르다.

"정의" 라 하면, 메모리 공간을 할당 받아서 변수로서의 기능을 수행 할 준비가 된것이고

"선언" 이라 하면, 아직 메모리 공간을 받지 못한 상태로 껍데기만 있는것이다.

(다르긴 하지만, 마치 포인터 같은것으로 생각 하면 된다.)

즉 외부 파일 어딘가에 정의 되어 있는 변수를 사용하겠다. 라고 선언을 해 주는것이다.

sample.h

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

#ifndef __SAMPLE_H__

#define __SAMPLE_H__

int intCheck = 0; /* sample.h에서 전역 변수로 정의 되어 메모리 공간을 확보 하였다. */

/* 전역 변수는 큐영역에 자리를 잡으며 프로그램이 종료할때 까지 살아 있는다. */

long lChek = 0;

#endif /* __SAMPLE_H__ */

sample.c

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

void sam (void)

{

/*doing */

}

main.c

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

#include "sample.h"

extern int intCheck;

extern long lChek;

int main(void)

{

intcnt = 0; /* 지역 변수로 스택에 자리를 잡으며, 함수가 끝남과 같이 사라진다. */

/* 여기서는 메인 함수 있으므로 전역변수 와 무늬만 같고, 스택에 자리를 잡을꺼 같쥐?^^ */

printf("%d\n", intCheck);

}

int sub(void)

{

int calcnt = 0; /* 지역변수로 스택에 자리를 잡는다. sub 함수와 같은 생명주기를 갔는다.

}