CnUnix

[알림판목록 I] [알림판목록 II] [글목록][이 전][다 음]
[ CnUnix ] in KIDS
글 쓴 이(By): heloise (오후의햇살)
날 짜 (Date): 2002년 7월 17일 수요일 오전 03시 33분 42초
제 목(Title): Re: 소스파일이 여러개일때 전역변수 선언 


저는, 질문 자체의 상황이, 제가 이해하고 있는 것과
달라서 궁금해지는데요.

preprocessing이 되어서 헤더파일은 다 처리되었다고 치고,

이를테면,

test1.c ============================
void foobar (void);
int a;

int main ()
{
 a = 7;
 foobar ();
}
====================================
test2.c ============================
int a;
void foobar (void)
{
 a = 9;
}
====================================

이런 상황이 있을때, 즉 int a; 가 글로벌로
여러군데 선언되어있을 때, 이건 multiple-definition이
아닌 것으로 저는 알고 있거든요.
gcc로 컴파일해도 (gcc test1.c test2.c) 잘 컴파일되구요.

만약 위의 int a;가 int a=10; 처럼 바뀐다면,
이건 multiple_definition error입니다.

변수 선언을 할 때, initializer(위의 예에서는 10) 까지 있으면,
이것은 확실히 definition (definition이 의미하는 것은
그 변수를 저장할 메모리가 할당된다는 뜻이죠. 반대로
선언만 하면, 그냥 아 이변수는 4바이트 짜리 변수구나,
하는 식의 정보만 주게됩니다.)이어서,
gcc test1.c test2.c는 multiple-definition error를 내게
됩니다.  그렇지만, int a; 처럼 값을 초기화하는 initializer
가 붙지 않은 경우에는, 이건 tentative-definition이라고
해서, 꼭 definition으로 취급되지는 않습니다.
전체 프로그램에서 int a; 가 여러번 있다면,
그중에 하나만  select해서 definition으로 취급하고,
나머지는 그냥 선언처럼 (extern int a; 처럼) 취급하게 됩니다.
(연관된 설명들은, K&R 부록  A10.2 external declarations 를
보면 찾을 수 있습니다.)

따라서 만약 질문의 경우가 제가 위에서 든
example과 같은 경우라면 왜 error가 생겼는지 모르겠네요.

물론, error이고 아니고를 떠나서,
위의 어떤 분이 설명하신 것 처럼,
definition에 해당하는 건, 한 소스파일에 넣고 (헤더가 아닌),
그냥 선언인 것은 extern 해서 헤더에 넣어서 여러군데
포함되게 하는 것이, readability도 그렇고
좋은 프로그래밍 습관이겠지요.

암튼, 궁금하네요. 어떤 컴파일러를 쓰셨는지...

[알림판목록 I] [알림판목록 II] [글 목록][이 전][다 음]
키 즈 는 열 린 사 람 들 의 모 임 입 니 다.