C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[47114] Re:extern func(); 형식은 언제 사용하는건지 궁금합니다.
전재득 [jedclub] 1602 읽음    2006-11-16 18:32
모든 컴파일러가 동일하게 작동한다고 말하긴 어렵지만...
일단 c/c++을 놓고 봤을때 extern "C" 를 하는것은 c++의 오버로딩이 함수 호출시
어려움을 가져다 줄 수 있기 때문에, c++은 컴파일러 내부적으로 오버로딩시 또는 오버로딩을
굳이 하지 않더라도 다른 함수명을 (직접생성?) 하여 링크를 합니다. 하지만 C의 경우에는 그 함수의
심볼을 그대로 사용 합니다. 따라서 C언어 함수 호출 스펙에 맞게 하기위해 extern "C"를 사용하게 됩니다.
컴파일러마다 조금씩 다릅니다만. 링크시 오브젝트만 등록해도 바로 호출해서 쓸수있는 경우가 있습니다.
(GCC의 경우) extern func(); 의 경우에는 원본과 링크 이외에는 특별한 목적이나, 내용이 전혀 없습니다.
단지 원본과 연결만 해 줄 뿐이죠.. 한마디로 링크시 연결만 해주느 메크로에 불과 한거죠...
각각의 파일들을 미리 컴파일하고 마지막으로 한번에 링크 과정을 거치게 되는데, 그때 전역에 선언된 모든
심볼들은 일종의 심볼 테이블을 가지고 있고, 링크시 서로 연결 시켜주게 되어 있지요...
결론적으로 차이점을 본다면, 저는 문법상의 이해라고 봅니다. 물론 c++의 경우에는 앞서 설명했듯 링크가
힘들수 있기때문에 "C"스펙을 사용하게 됩니다만. 그외의 extern은 링크시 도움을 주는 역활 밖에 없습니다.
원본의 H파일에 선언이 되어있고 그걸 인클루드해서 쓴다면 다시 사용하는 쪽의 C파일에 굳이 extern을 할
필요가 없게 됩니다. conio.h 처럼 말이죠..  하지만 h파일없이 c파일만 컴파일이 되어있고 거기에 전역
함수가 등록 되어 있는 경우. (그냥찾기도합니다만) 문법상 이나, 없는 레퍼런스를 그냥 가져다 쓰는것도 우습기에
extern 해서 외부에 이런게 있다고 코딩하는 사람이나 컴파일러에게 알려주게 되는거죠...
다시말해 extern을 넣는 경우에는 원본 h가 없는 경우 obj만 가지고 링크를 시도할때 사용하고,
그외의 경우에 (원본 h가 있는경우)는 그냥 인클루드해서 사용하는게 올바르다고 할 수 있겠네요...


허접한 답변 봐주셔서 감사합니다 ㅎㅎ


마술감자.명국진 님이 쓰신 글 :
: 제가 알기로는 a.cpp같은데서 b.cpp에 바디가 있는 함수를 호출하기 위해서 사용하는것으로 알고 있고,
: 헬프에도 그렇게 나와있는것 같습니다. (TurboC++, VC7둘다)
:
: 그런데 TurboC++과 VC7의 stdio.h나 conio.h같은 헤더를 뒤져보면
: 외부로 노출하는 함수에 extern을 하나도 붙이지 않고 있네요.. (C++인 경우는 extern "C"지만 C인 경우는 안붙네요..)
:
: 오랫동안 extern을 당연히 붙이는것으로 알고 코딩하고 있었는데
: 다른분의 코드를 리뷰하다가 안 붙이는걸 보고 궁금해서 찾다가 답을 못찾아서 질문 올립니다
:
: 함수 선언시에 extern function(); 과 function(); 의 차이점과 컴파일러/링커의 구현까지 어떻게 되는지 알고 싶습니다.

+ -

관련 글 리스트
47017 extern func(); 형식은 언제 사용하는건지 궁금합니다. 마술감자.명국진 1024 2006/11/08
47114     Re:extern func(); 형식은 언제 사용하는건지 궁금합니다. 전재득 1602 2006/11/16
47115         Re:Re:extern func(); 형식은 언제 사용하는건지 궁금합니다. 마술감자.명국진 1151 2006/11/16
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.