본문 바로가기
Programming/Tip&News

extern "C" 가 뭐에요?

by 드로니뚜벅이 2023. 7. 12.

C에서 C++ 함수를 호출할 수 있고 C++에서 C함수를 호출할 수 있습니다. 그러나 단순히 일반적인 방법으로 호출할 경우 문제가 발생할 수 있습니다. C에서는 함수명이 다르면 다른 함수지만 C++에서는 함수 오버로딩을 지원하기 때문에 함수명이 같아도 다른 함수일 수 있습니다. 즉, C와 C++ 컴파일에서 함수이름를 다루는 규약이 다릅니다.

따라서, C++ 컴파일러는 C와 같이 함수명만으로 함수들을 구분할 수 없기 때문에 컴파일 과정에서 C++ 규약으로 함수 이름을 변경합니다. 이러한 규칙을 네임 맹글링(Name Mangling)이라고 합니다.

 

extern "C"

네임 맹글링으로 인해 C와 C++ 컴파일 과정에서 함수 표현 방식이 달라집니다. 따라서 서로를 호출하려고 하면 표현 방식의 차이로 인해 오류가 발생할 수 있다.

이런 오류를 해결하기 위해 extern "C" 지시자를 사용하여 컴파일 과정에서 C++ 방식의 네임 맹글링을 하지 않고 C 방식으로 컴파일을 합니다. 이렇게 하면 C와 C++의 함수 표현 방식이 같아지기 때문에 서로를 호출할 수 있습니다.

extern "C"는 C++ 컴파일러에서만 해석할 수 있는 구문이기 때문에 C 컴파일러에서는 오류가 발생합니다. 그래서, 부득이하게 C 컴파일러에서는 해당 구문을 해석하지 않도록 __cplusplus 전처리 구문으로 피해가야 합니다.

#ifdef __cplusplus // C++ 컴파일러
extern "C" {
#endif

int yourFunction(int param) 
{
    // 함수 구현
}


#ifdef __cplusplus
}
#endif

위처럼 처리하면 C와 C++ 컴파일러에서 모두 사용할 수 있습니다.

 

extern "C" 로 정의된 함수는 C 컴파일러 규약으로 컴파일이 되기 때문에 C++ 컴파일러로 컴파일이 되었다고 하더라도 다형성과 같은 C++의 특징이 적용되지 않습니다.