문제

가능한 복제 :
외부“C”가 필요한 이유 {#include가 필요한 이유u003Cfoo.h> } C ++에서?

나는 종종 다음과 같은 코딩 된 프로그램을 보았다.

extern "C" bool doSomeWork() {
  //
  return true;
}

우리는 왜 사용합니까? extern "C" 차단하다? 이것을 C ++의 무언가로 교체 할 수 있습니까? 사용하는 이점이 있습니까? extern "C"?

설명하는 링크가 보입니다 이것 그러나 이미 C ++가있을 때 왜 C에서 무언가를 컴파일해야합니까?

도움이 되었습니까?

해결책

Extern "C"는 이름이 엉망이되지 않습니다.

그것은 다음에 사용

  1. C ++에서 일부 C 라이브러리를 사용해야합니다.

    extern "C" int foo(int);
    
  2. c ++ 코드를 c로 내보내는 것이 필요합니다

    extern "C" int foo(int) { something; }
    
  3. 공유 라이브러리에서 상징을 해결할 수있는 능력이 필요하므로 망설선을 제거해야합니다.

    extern "C" int foo(int) { something; }
    ///
    typedef int (*foo_type)(int);
    foo_type f = (foo_type)dlsym(handle,"foo")
    

다른 팁

Extern "C"가 의미가있는 곳 중 하나는 C 코드로 컴파일 된 라이브러리에 링크 할 때입니다.

extern "C" {
  #include "c_only_header.h"
}

그렇지 않으면 라이브러리에 c -linkage (_myfunc)가 포함 된 함수가 포함되어 있지만 C ++ 컴파일러는 라이브러리의 헤더를 C ++ 코드로 처리 한 C ++ 컴파일러가 함수에 대한 C ++ 기호 이름 ( "_MyFunc@xazzye" -이 링커 오류가 발생할 수 있습니다. 각 컴파일러마다 Mangling 및 다릅니다).

외부 "C"가 사용되는 또 다른 장소는 C ++로 작성된 함수에 대해서도 C 연결을 보장하는 것입니다.

extern "C" void __stdcall PrintHello() {
  cout << "Hello World" << endl;
}

이러한 함수는 DLL으로 내보낼 수 있으며 컴파일이 이름을 관리하지 않기 때문에 다른 프로그래밍 언어에서 호출 할 수 있습니다. 동일한 함수의 다른 과부하를 추가 한 경우 (예 :

extern "C" void __stdcall PrintHello() {
  cout << "Hello World" << endl;
}
extern "C" void __stdcall PrintHello(const char *name) {
  cout << "Hello, " << name << endl;
}

그런 다음 대부분의 컴파일러는 이것을 포착하여 DLL-Public 함수에서 기능 오버로드를 사용하지 못하게합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top