스택큐힙리스트

어떤 이유로 메서드가 없는 헤더에 extern "C"를 사용해야 할까요? 본문

카테고리 없음

어떤 이유로 메서드가 없는 헤더에 extern "C"를 사용해야 할까요?

스택큐힙리스트 2023. 12. 1. 00:02
반응형

제가 자주 마주치는 C 헤더 파일들 중에는 실제 함수가 없고 extern C 가드만 있는 경우가 있습니다. 예를 들면:


/* b_ptrdiff.h - base type ptrdiff_t definition header */
#ifndef __INCb_ptrdiff_th
#define __INCb_ptrdiff_th
#ifdef __cplusplus
extern C {
#endif
#ifndef _PTRDIFF_T
#define _PTRDIFF_T
typedef long ptrdiff_t;
#endif /* _PTRDIFF_T */
#ifdef __cplusplus
}
#endif
#endif /* __INCb_ptrdiff_th */

extern C가 함수에 대해서 이름 맹글링을 방지한다는 것은 알고 있지만, 변수와 타입 선언에 대해서도 다른 인터페이싱 문제를 방지하는 것인지 궁금합니다.


위 예시에서 extern C의 사용은 결과적으로 호환성과 관련해서는 의미가 없는 것인가요?

답변 1

일부 컴파일러(이는 드물긴 하지만)는 변수에 대해서도 함수와 마찬가지로 이름 맹글링을 구현합니다. 그 경우에는 extern C가 필요할 수 있습니다.


일부 컴파일러(이것은 드물지만 표준에서 요구되는)는 함수 타입에 대한 언어 연결도 구현합니다. 그래서 typedef void f();extern C { typedef void f(); }는 다른 타입을 선언합니다.


또한, 일부 유지 보수자들은 함수를 추가하기 위해 헤더를 수정할 때 extern C의 부재를 인지하지 못할 수도 있습니다.


내가 추천하는 것은 그냥 포함하는 것입니다.

답변 2

외부 C는 함수가 없는 헤더 파일에서 사용할 이유가 있습니까?
C++에서 extern C는 C 언어와의 호환성을 유지하기 위해 사용됩니다. C++은 C와 일부 호환성이 있지만, C++에서의 함수 오버로딩, 예외 처리, 클래스, 네임스페이스 등과 같은 특징은 C에는 없는 개념입니다. 때문에, C++ 코드는 C 컴파일러에서 나타나지 않는 문제를 야기할 수 있습니다. 이를 방지하기 위해, extern C를 사용하여 C++ 코드를 C 언어와 호환 가능한 형태로 변환하는 것이 좋습니다.
하지만, 함수가 없는 헤더 파일에서 extern C를 사용하는 이유는 제한적입니다. 함수가 없다면, C++ 컴파일러와의 호환 문제는 발생하지 않기 때문입니다. 따라서, 헤더 파일이 함수 선언을 포함하지 않는다면, extern C를 사용할 필요는 없습니다.
그러나 헤더 파일이 클래스나 구조체 등 C++에서 사용되는 데이터 유형 또는 매크로를 정의한다면, extern C를 사용하여 C++에서 이를 적절하게 해석하도록 해주는 것이 좋습니다. 특히, C++ 코드에서 해당 헤더 파일을 가져와 사용하는 경우에는 extern C를 사용하여 호환성 문제를 방지하는 것이 좋습니다.
결론적으로, 함수가 없는 헤더 파일에서는 extern C를 사용할 필요성이 제한적입니다. 그러나 C++ 코드와의 호환성을 고려하여 헤더 파일이 C++에서 사용되는 데이터 유형이나 매크로를 정의할 경우에는 extern C를 사용하여 이를 적절하게 해석하도록 해주는 것이 좋습니다.

반응형
Comments