| [ CnUnix ] in KIDS 글 쓴 이(By): heloise (오후의햇살) 날 짜 (Date): 2002년 7월 17일 수요일 오전 06시 19분 41초 제 목(Title): Re: 소스파일이 여러개일때 전역변수 선언 뭐, 실험해보심 알겠지만, 제가 쓰는 컴파일러 (gcc와 MS의 compiler를 포함해서)들은 에러를 발생시키지 않습니다. 혹, 에러를 발생시키는 컴파일러를 알고 계시면, 가르쳐주십시오. ---------------------------- 사실, 이 경우에는 tentative definition들이 여러 파일에 흩어져 있기 때문에 어떻게 처리되어야 하는가 하는 것이 standard에 명시되어있는지는 잘 모르겠습니다. 하지만, 다음과 같은 룰 때문에 int a = 10; /* 이건 definition 입니다. */ int a; /* 이건 tentative definition 입니다. */ extern int a; /* 이건 definition이 아닌, 선언 이지요. */ 만약, 한 파일에 int a; int a; 위와 같이 tentative definition이 여러번 나타난다면, 이것은 에러가 아닙니다. tentative definition 이 처리되는 룰은, 한 파일 내에서 tentative definition은 여러번 나타나도 상관 없고, 만약 그 파일내에서 definition (int a = 10; 같은 것)이 있다면 (물론 하나 여야 겠지요.) 그 파일내의 모든 tentative definition들은 그냥 선언으로 취급됩니다. 만약 그 파일내에 definition이 없다면, tentative definition 에 의해서 그 변수가 define되지요. 근데, 만약 한 프로그램을 구성하는 여러 파일들에 int a; 같은 tentative definition이 흩어져 있을 경우, 위에서 말씀드린 tentative-definition에 관한 룰을 한 파일내에서가 아니라 프로그램 전체에 적용시키는 경우가 많은 것으로 알고 있습니다. 즉, 프로그램 전체에서 a의 definition이 존재하면, 다른 모든 tentative definition들은 선언으로 처리하고, a의 explicit한 definition이 없으면, tentative definition에 의해서 그 변수의 definition을 만드는 거죠. gcc도 그런 것 같구요. 그래서 tentative definition은 여러번 나타나도 허용이 되는 것 같습니다. 하지만, linker자체에 혹시, 이런 tentative definition이 여러파일에 있는 경우를 다르게 처리해주는 (1. tentative definition이 여러파일에 나타난 것을 용인하는, 2. 용인하지 않는) 그런 옵션이 있을 수도 있을지, 잘 모르겠네요. ====================================================================== Skepticism is the chastity of the intellect, and it is shameful to surrender it too soon or to the first comer: there is nobility in preserving it coolly and proudly through long youth, until at last, in the ripeness of instinct and discretion, it can be safely exchanged for fidelity and happiness. ====================================================================== |