extern "C" 에 대한 질문
글쓴이: knoxxr / 작성시간: 수, 2015/08/05 - 11:16오전
extern "C"에 대해 질문드립니다
extern "C"라는게 C형태로 name mangling 해라라고 알고 있는데요.
그 목적에 대해 이해가 잘 되지 않습니다.
1. C++ 도 컴파일러마다 네이밍 규칙이 틀린데
C도 컴파일러마다 네이밍 규칙이 틀린거 아닌가요?
그렇다면 extern "C"라고 하는건 무슨 의미를 가지게 되는지??
2. 만약 extern "C"라고 해 놓고
이 함수를 다른 C++모듈에서 사용할 경우
오버라이딩된 함수 (이름이 같고 파라미터가 틀린 함수)는 어떻게 구분되는 건가요?
3. 이렇게 extern "C"를 사용해야할 상황에는 어떤 경우가 있을까요?
Forums:
제가 아는 한도에서 답변합니다. 틀린 경우 지적 달게
제가 아는 한도에서 답변합니다. 틀린 경우 지적 달게 받겠습니다.
1. C++만 달라요. 리눅스 쓰신다면 당장 컴파일하고 나온 오브젝트 파일에
(C는 binary 호환성을 갖고, C++는 컴파일러가 다르면 호환성이 없습니다.)
2. 구분 못해요. C에서는 overloading 개념이 없습니다.
질문자가 잘못 알고 있는게, 이름이 같고 파라미터가 다른 함수를 구현하는 것을 function overloading 이라고 합니다.
overriding은 C++ 클래스에서 상속된 함수를 덧씌울때 사용하는 용어입니다. (책에 따라서 이름을 가린다고 표현하기도 하죠)
3. C 인터페이스를 갖는 C++ 라이브러리 작성 정도가 있겠네요.
그렇게 하면 헤더파일만 공개하고 라이브러리는 별도의 컴파일 과정 없이 바이너리 형태로 바로 제공해 줄 수 있죠.
C++ 인터페이스를 갖는 경우 라이브러리를 바이너리 형태로 바로 제공하기 힘듭니다.
또 상업용 라이브러리의 경우 소스 코드를 공개하면 안되는데(사실 공개해도 되지만... 비공개가 맞겠죠?)
C++ 인터페이스를 갖는 라이브러리의 경우 헤더파일 + compiler specific- 라이브러리 제공.. 너무 비효율적이죠?
(플랫폼 경우의 수 * 컴파일러 수..?)
물론 소스코드 공개해도 될 경우 그냥 C++ 인터페이스 제공해줘도 큰 무리 없을 겁니다.(c++ boost library)
질문자님은 지금..
extern "C"라는게 C형태로 name mangling 해라라고 알고 있는데요.
ㄴ이걸 반대로 알고 계시기 때문에 혼동되시는듯 싶네요.
extern "C"는 다른 C 모듈에서도 사용할 수 있도록 맹글링 하지 말아라! 라는 의미입니다.
1. C는 기본적으로 심볼명을 선언한 이름 그대로
1. C는 기본적으로 심볼명을 선언한 이름 그대로 만듭니다. 즉, mangling을 하지 않습니다. 따라서 C 컴파일러는 네이밍 규칙이라는게 없습니다.
2. extern "C"를 하면 mangling을 하지 않기 때문에 오버라이딩을 할 수 없습니다.
3. C++ 컴파일러로 컴파일된 오브젝트의 심볼명을 C 컴파일러로 컴파일되는 오브젝트에서 호출 할 때 사용합니다.
오버 로딩.. ^^ 이겠죠.
오버 로딩.. ^^ 이겠죠.
---
http://coolengineer.com
댓글 달기