2012-03-13 3 views
16

두 라이브러리 (예 : A와 B)를 연결해야합니다. 일부 파일은 두 라이브러리에서 공통적으로 사용됩니다. 그래서 라이브러리 A의 함수를 네임 스페이스, 즉 abc 안에 선언합니다.C++ : 네임 스페이스 내의 Extern C 함수

[ in A] 

    namespace abc { 
    extern "C" void func(); 
    } 


[in B] 

    extern "C" void func(); 

프로젝트를 빌드하는 동안, 컴파일러는 함수 FUNC의 여러 정의를 말하는 연결 오류가 발생합니다 : 그래서, A와 B에, func 함수는 다음과 같습니다. A에서 함수가 네임 스페이스 내부에서 작동하지 않거나 extern "C"함수에 문제가 있습니다. 있다면, 나는 어떻게 그들을 둘 다 구별 할 수 있습니까?

답변

23

Extern "C"를 사용할 때 네임 스페이스 정보를 잃어 버리기 때문에 네임 스페이스 정보가 손실되므로 C에 그런 개념이 없습니다. 이로 인해 중복 정의가 발생합니다.

+1

그러나 C 전처리 기는 이름 변환이 해제되어 있지 않을 수 있습니다. Visual C++ 2010에서'__FUNCTION__' 매크로의 값은 'extern "C"'에서도 완전 식별자입니다. "당신의 이름". '__FUNCTION__','__PRETTY_FUNCTION__' 또는'__func__'와 같은 사전 정의 된 매크로를 사용하는 네임 스페이스에서 매크로를 호출하면 이러한 문제가 발생할 수 있습니다. 내 경우에는 (DLL에서 C 스텁을 내 보냅니다) ;-) –