2018년 10월 29일 월요일

extern "C"

C 와 다르게 C++ 은 함수 overloading 을 지원하기 위해 컴파일시 최종 함수 이름에 변형을 가한다.

그러므로 C++ 로 작성한 DLL 등의 동적 라이브러리를 사용하는 경우 header 에 지정된 함수 이름으로 함수를 찾지 못하는 문제가 발생한다.

그러나 extern "C" { ... } 로 감싼 부분의 코드는 C++ compiler 가 C compiler 처럼 함수 이름에 변형을 가하지 않기 때문에 다른 프로그램이 해당 이름으로 함수를 호출할 수 있다.

예)

#ifdef __cplusplus
extern "C" {
#endif

void hello(void);

#ifdef __cplusplus
}
#endif

C++ compiler 는 __cplusplus 값을 미리 선언하므로 해당 값이 선언되었는지 확인하여 C++ compiler 의 경우한 extern "C" 로 감싸도록 한다.

보통 header 파일은 동적 라이브러리와 함께 배포된다.

extern "C" 영역 안에는 C 코드로만 작성되어야만 하기 때문에 C++ 에서만 사용되는 class 등의 키워드는 포함되면 안된다.

extern "C" 영역의 코드는 C compiler 로 컴파일 할 때도 문제 없도록 c++ 코드가 없도록 해야 한다.


댓글 없음:

댓글 쓰기