sourcecode

외부 "C++"를 사용하는 이유는 무엇입니까?

copyscript 2022. 9. 6. 22:25
반응형

외부 "C++"를 사용하는 이유는 무엇입니까?

문서에서는 키워드 extern 뒤에 "C" 또는 "C++"를 붙일 수 있습니다.외부 "C++"를 사용하는 이유는 무엇입니까?실용적입니까?

언어에는 다음이 있습니다.

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

만약 foo.h에 C++링크가 필요한 것이 포함되어 있다면?

    void f_plain(const char *);
    extern "C++" void f_fancy(const std::string &);

그래야 링커를 행복하게 할 수 있어

왜 그렇게 해야 하는지는 모르겠지만 Sun의 이 기사에 따르면 외부 "C" 블록 안에 있는 외부 "C++"를 사용하여 "C" 함수 그룹에 네이티브 C++ 링크가 있는 특정 함수를 지정할 수 있습니다.

extern "C" {
    void f();             // C linkage
    extern "C++" {
        void g();         // C++ linkage
        extern "C" void h(); // C linkage
        void g2();        // C++ linkage
    }
    extern "C++" void k();// C++ linkage
    void m();             // C linkage
}

사용할 .extern "C++"암묵적인 디폴트인 링크를 명시할 뿐입니다.일부 멤버가 외부 "C" 링크를 가지고 있는 클래스가 있는 경우, 다른 멤버가 외부 "C++"라는 명시적인 상태를 원할 수 있습니다.

으로 C++를 정의하고 .extern "anystring"한다.extern "C" ★★★★★★★★★★★★★★★★★」extern "C++"롭게 정의할 수 extern "Pascal"또는 심지어extern "COM+"츠키노

외부 "C"는 많은 사람들이 대답합니다.extern "C++"의 사용 사례는 C 함수의 C++ 라이브러리 함수를 호출하는 경우입니다.관련된 서브유스 케이스는 C++ 라이브러리를 메인 함수와 C 소스 코드로 링크하는 경우입니다.자세한 내용은 다음 Wiki 페이지를 참조하십시오.

두 가지 추측:

  • extern "C" C C++ 언어 연동을 얻을 수 .extern "C++".
  • 되어 있다C++링크, C++를 정의하는 문서이기 때문입니다. 더 잘 할 수 있습니까?C++그 자체보다 더 많은 언어 연결성을 가지고 있습니다.또한 완전성도 제공합니다.signed/unsigned

다음 답변을 읽어보십시오.extern "LanguageName"에는 (', GCC')가 있습니다.extern "Java"도 마찬가지입니다을 사용하다

간단히 말하면 외부 C를 사용하여 컴파일러에 이름 망글링을 사용하지 않도록 지시할 수 있습니다.즉, 같은 프로젝트에서 C와 C++ 코드의 비트를 링크할 수 있습니다.

extern "C"는 C++ 함수에 C 링크가 있어야 함을 나타낼 때 사용됩니다.이것은 실장에 의존하지만, 통상은 C++ 네임 매니징(그리고 오버로드와 엄격한 타입 체크)을 오프합니다.C++ 함수가 있는 경우 C 코드에서 호출할 수 있습니다.

extern "C" void Foo();   // can be called easily from C

외부 "C++"는 C++ 스탠다드에서는 허용되지만 실제 코드로 본 적은 없습니다.수술 금지인가 봐요.

C와 C++는 다른 이름 망글링 규칙을 사용합니다.기본적으로 외부 "C"는 C++ 컴파일러에게 함수의 이름을 C가 지정하는 것과 같이 지정하도록 지시합니다.

사용할 링크 규칙을 지정합니다.대부분의 언어는 "C" 스타일 함수와 연결하는 방법을 알고 있습니다.

이것은, 다음의 2개의 경우에 필요합니다.

  • C++로 작성된 함수를 호출하는 C(또는 해당 문제에 대한 다른 언어) 프로그램
  • C로 작성된 함수를 호출하는 C++ 프로그램

예:

// declared in function.h
void f1(void);

오브젝트 테이블의 이름이 C++ 규약을 사용하기 때문에 C 코드(실제로 다른 언어도 C 함수와 링크할 수 있음)는 링크할 수 없습니다.

쓰시면

extern "C" void f1(void);

이 링크는 C 표기법을 사용하기 때문에 동작합니다.

extern 'C'를 사용하는 이유 1위는 C++의 이름 뭉개기 규칙을 피하기 위해서입니다.이것은 에서 작업하는 경우 매우 중요합니다.특정 네이티브 기능으로 PInvoke 하고 싶은 넷 언어.이를 수행하려면 이름 망글링을 비활성화해야 합니다.

두 번째 질문에 대답하자면, "실용적인가?"":

다음과 같은 표준 헤더에서는 실용적이고 실질적으로 피할 수 없습니다.<cmath>.

헤더 전용 라이브러리 X.h는 C++와 C의 공통 서브셋으로 쓰여져 양쪽 언어에서 사용되도록 되어 있습니다.C++ 사용자의 편의를 위해 X.h에는 다음이 포함됩니다.<cmath>,것은 아니다.<math.h>이 방법은 C 사용자에게는 적용되지 않습니다.<cmath>모든 것을 에 끼워 넣다extern "C++" {...}.

언급URL : https://stackoverflow.com/questions/610934/why-would-you-use-extern-c

반응형