[C, C++] extern “C” 의미

C와 C++간의 함수 호출

C에서 C++ 함수를 호출할 수 있고, C++에서 C함수를 호출할 수 있다. 그러나 단순히 일반적인 방법으로 호출할 경우 문제가 발생할 수 있다. C에서는 함수명이 다르면 다른 함수지만 C++에서는 함수 오버로딩을 지원하기 때문에 함수명이 같아도 다른 함수일 수 있다. 예를 들어 fun(int a)와 fun(int a, int b)는 다른 함수다. 따라서 C++ 컴파일러는 C와같이 함수명만으로 함수들을 구분할 수 없기 때문에 컴파일 과정에서 C++ 나름의 규칙으로 함수 이름을 변경한다. 이 규칙을 네임 맹글링(Name Mangling)이라고 한다.

extern “C”

네임 맹글링으로 인해 C와 C++ 바이너리에서의 함수 표현 방식이 달라진다. 따라서 서로를 호출하려고 하면 표현 방식의 차이로 오류가 발생할 수 있다.(아마 symbol 오류가 발생할 것이다.) 이때 extern “C” 지시자를 쓴다면 extern “C”로 묶인 내부에는 컴파일 과정에서 C++ 방식의 네임 맹글링을 하지 않고 C방식으로 컴파일한다. 따라서 C와 C++의 함수 표현 방식이 같아지기 때문에 서로를 호출할 수 있다. 이때 C++컴파일러와 달리 C 컴파일러는 extern “C”를 해석하지 못한다. 따라서 C++에서만 해석하도록 _cplusplus 내부에 extern “C”를 선언한다.

#ifdef __cplusplus
extern "C" {
#endif

int fun(int a);

#ifdef __cplusplus
}
#endif

Leave a Comment