들어가기
위와 같이 정이하면 된다. 즉 "__cplusplus"는 C++ 컴파일러라을 사용하고 있다는 의미이다.
그래서 C++이라면 extern "C"를 사용해서 선언하면 된다. 간단하게 사용하면,
처럼 사용할 수 있다. C++과 C를 선택적으로 호환 가능한 헤더 파일을 만들기 위해서 #ifdef 전처리기를 사용해서 선택적으로 선언해서 사용하는 것이 좋다.
C++에서 C에 함수를 사용시 주의해야하는 사항이 있다. 아무 생각없이 C 함수를 사용한다면, 무시무시한 링크오류의 늪에 빠져들고 만다. 늪에 빠져든다고 해도 정신만 차리면 나올 수 있다.
단순히 링크 오류에 대해서만 찾고 계신다면 혹시 아래와 같은 상황이라면 이 글을 읽어보길 바란다.
단순히 링크 오류에 대해서만 찾고 계신다면 혹시 아래와 같은 상황이라면 이 글을 읽어보길 바란다.
- C++ 프로그래밍을 하고 있고 다른 곳에 예제를 그대로 사용하고 있는데 링크에러가 뜬다.
- include나 lib 폴더도 정확하고 불러오는 라이브러리 파일도 정확한데 링크에러가 뜬다.
- 컴파일러 옵션이나 링크 옵션도 이리저리 바꿔보아도 링크에러가 뜬다.
- 다른 함수는 이상이 없는데 특정 일부 함수만 링크에러가 뜬다.
- 지금 사용하는 라이브리가 C용 라이브러리이다.
링크오류
VC++에서는 이런 링크 오류가 LNK2019로 표시된다. 물론 반드시 이렇다는 것은 아니다.
Server.obj : error LNK2019: unresolved external symbol "void __cdecl event_err(int,char const *,...)" (?event_err@@YAXHPBDZZ) referenced in function "void __cdecl on_accept(int,short,void *)" (?on_accept@@YAXHFPAX@Z)
위는 본인이 경험했던 오류이다. 이 문제를 해결하려면 아래 내용을 읽어보길 바란다.
C++에서 C 함수 사용하기
C++에서 검파일된 함수 정의와 C에서 컴파일된 함수 정의는 다르다. 같은 함수 이름을 정의해서 다른 함수로 인식하여 사용하게 된다. 물론 이렇게 하면 나중에 혼란이 발생할 우려가 있으니 사용하면 안되겠지만...
C++에서 C++함수 사용은 당연히 문제가 없다. 그러나 C++에서 C 함수 사용함에 있어서 C 헤더 파일 정의에 주의해야한다.
그럼 C 헤더 파일 정의는 어떻게 될까?
C++에서 C++함수 사용은 당연히 문제가 없다. 그러나 C++에서 C 함수 사용함에 있어서 C 헤더 파일 정의에 주의해야한다.
그럼 C 헤더 파일 정의는 어떻게 될까?
// sample.h
#ifdef __cplusplus
extern "C" {
#endif
void event_err(int eval, const char *fmt, ...);
//... (중략)
#ifdef __cplusplus
};
#endif
#ifdef __cplusplus
extern "C" {
#endif
void event_err(int eval, const char *fmt, ...);
//... (중략)
#ifdef __cplusplus
};
#endif
위와 같이 정이하면 된다. 즉 "__cplusplus"는 C++ 컴파일러라을 사용하고 있다는 의미이다.
그래서 C++이라면 extern "C"를 사용해서 선언하면 된다. 간단하게 사용하면,
extern "C" void event_err(int eval, const char *fmt, ...);
처럼 사용할 수 있다. C++과 C를 선택적으로 호환 가능한 헤더 파일을 만들기 위해서 #ifdef 전처리기를 사용해서 선택적으로 선언해서 사용하는 것이 좋다.
결론
C++에서 C 함수를 사용하는 것은 잘 알고 있었던 내용이다. 그러나 링크에러가 발생하고, 단순히 라이브러리 링크에 문제가 있다고, 컴파일러에 문제가 있다고, 아니면 설정에 문제가 있다고만 생각한 것이 큰 실수 였다.
이로 인해 내가 몇시간이라는 귀중한 시간을 소비해버렸다. 정말 짜증이 해일 처럼 밀려온다.
그렇게 해서 혹시 같은 어려움을 갖고 있는 분들에게 도움이 되려고 내용을 작성하였다. 물론 링크 오류외에 C++에서 C함수를 사용하는 내용도 있으나, 그 내용말고 링크 오류에 대한 내용도 같이 참고하면 나중에 도움이 되리라 생각한다.ospace.
이로 인해 내가 몇시간이라는 귀중한 시간을 소비해버렸다. 정말 짜증이 해일 처럼 밀려온다.
그렇게 해서 혹시 같은 어려움을 갖고 있는 분들에게 도움이 되려고 내용을 작성하였다. 물론 링크 오류외에 C++에서 C함수를 사용하는 내용도 있으나, 그 내용말고 링크 오류에 대한 내용도 같이 참고하면 나중에 도움이 되리라 생각한다.ospace.
'프로그래밍 > 리서치결과' 카테고리의 다른 글
FORTRAN DLL과 MFC간 연동중에 해결된사항이나 확인이 안된것 (0) | 2011.02.10 |
---|---|
manifest (0) | 2010.12.30 |
포트란 다차원배열 해결법이라고 해야하나... (0) | 2010.09.28 |
포트란에서 C/C++ 함수 읽기 예제 (0) | 2010.09.09 |
NSIS (배포프로그램) CUSTOM 대화상자 띄우기 + 시리얼넘버(serial number) 적용 (1) | 2010.05.31 |