| [ 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도 그렇고 좋은 프로그래밍 습관이겠지요. 암튼, 궁금하네요. 어떤 컴파일러를 쓰셨는지... |