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
[17509] Re:[질문] *.C와 *.CPP를 같이 컴파일할때..
김성규 [] 3372 읽음    2002-04-13 15:08
박정만 님이 쓰신 글 :
: 프로젝트 안에 *.C와 *.CPP가 같이 섞여있거든요.
:
: 근데, 컴파일하면 무수한 에러가 우두두 뜹니다.
:
: 그런데, *.C의 파일명을 *.CPP로 바꾸면 멀쩡하게 실행되거든요.
:
: extern "C"를 선언하면 된다고 들은 것 같은데, 그래도 안되네요.
:
: 구체적인 해결 방법을 부탁드립니다.
:

C와 C++ 코드는 링크시 서로 따로 관리됩니다.

함수 호출 방법등 많은 점이 다르기 때문이죠.

(자세한건 묻지마세요.. 잘 모르니깐..ㅡ,.ㅡa)

따라서 어떤 함수를 호출하는데 이건 C코드 중에서 찾아라.. 이건 C++에서 찾아라..

이런 것을 컴파일러에게 알려주어야 합니다. 그래야 링커가 제대로 찾아서 링크하겠져.

예를 들자면..

printf 함수는 C코드 함수입니다.

따라서 C코드에서 찾아라 하고 알려주어야 합니다.

안그러면 C++코드 중에 없다고 불평합니다.

그래서 헤더파일에 프로토타입을 쓸때 다음과 같이 쓰면 되지요.

extern "C" int printf....
extern "C" int sprintf....
extern "C" int vprintf....
extern "C" int fprintf....


근데 이거 귀찮지여.. 한두개면 몰라도 한 1000개쯤 되면 미칠 겁니다.

다음과 같이 쓰면 됩니다.

extern "C"
{
    int printf...
    int sprintf...
     ...
}

근데 이렇게 소스를 수정해 버리면 C++ 컴파일러에서는 문제가 없지만..

C 컴파일러가 extern "C" 를 알아 듣지 못하니 다시 C 컴파일러로 컴파일하자면 이번엔

C컴파일러가 불평을 합니다. 그래서 다음과 같이 씁니다.

#ifdef __cplusplus
extern "C"
{
#endif
    int printf...
    int sprintf...
     ...
#ifdef __cplusplus
}
#endif

__cplusplus는 모든 C++ 컴파일러가 내부적으로 가지고 있는 미리 정의된 define이져..

C 컴파일러는 없으니 #ifdef .. #endif 는 C 컴파일러로 컴파일할 때는 무시됩니다.

이제 문제가 없지여. C나 C++이나 다 쓸 수 있습니다.

보통 C++ 컴파일러들은 C 컴파일러를 같이 가지고 있습니다.

.C 는 C 컴파일러로 컴파일하고.. .CPP는 C++ 컴파일러로 컴파일하져.

따라서 저런 작업을 해주지 않으면.. 에러가 무수하게 쏟아 집니다.

그럼 .CPP 로 바꾸면 되는 이유는? 모두 C++코드로 관리되니까 링크에러가 날리없져..

문제는 .C 소스를 가지고 있지 않는 경우 즉 .lib나 .obj 파일만 가지고 링크하려면..

C++코드로 컴파일할 수 없으니.. C 코드 중에서 찾아라라고 위에서 말한 방법으로 헤더를

수정해주는 수밖에 없지여.

도움이 되셨길...

+ -

관련 글 리스트
17491 [질문] *.C와 *.CPP를 같이 컴파일할때.. 박정만 1299 2002/04/13
17509     Re:[질문] *.C와 *.CPP를 같이 컴파일할때.. 김성규 3372 2002/04/13
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.