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 함수와 같은 생명주기를 갔는다.
}
'UNIX_LINUX_C_C++' 카테고리의 다른 글
[펌] 제1장 네트웍 프로그래밍의 이해 (0) | 2011.10.14 |
---|---|
[펌] 제2장 UNIX BSD 소켓 시스템 콜 (0) | 2011.10.14 |
[펌] Unix C 로 코딩할때 필요한 기본적인것들 - 목차[5장까지] (0) | 2011.10.14 |
[unix c/c++] undefined reference to `xxxxxx` (0) | 2011.09.07 |
[c/c++] 멀티 스레드 기술(예제 포함) (0) | 2011.09.06 |