C ++ Linkage C 이외의 언어?


25

C ++ 언어를 사용하면 하나의 소스 파일에서 C ++와 C를 혼합 할 수 있습니다. 예를 들어

extern "C" {
    struct bar { /* ... */ }
}

C ++ 또는 C 이외의 다른 "링크 언어"를 지원 한 적이 있습니까? 예 extern "Pascal"또는extern "Haskell"


대부분의 경우 두 언어는 extern "C"서로 상호 작용하기 위해 동등한 기능을 수행합니다.
ratchet freak

C ++은 구현이 연계 유형 (§7.5)을 추가 할 수 있도록하여 다른 연계를 지원합니다. 문제는 "구현이 존재하거나 구현이 존재해야합니다";-)
johannes

2
extern "C"블록 내부의 텍스트 구문 및 의미가 아닌 링크에만 영향을줍니다. 다시 말해서, 그것은 여전히 ​​그 extern "C"블록 안에 C ++입니다 . 심볼 이름은 엉망이 아닙니다. stackoverflow.com/q/1041866/712605
Richard Hansen이

답변:


17

extern "C" 유일하게 필요한 것일 수 있습니다.

모든 구현은 C 프로그래밍 언어로 작성된 함수 "C"에 대한 링크 및 C ++ 함수 "C ++"에 대한 링크를 제공해야합니다.

그러나이 인용에 따라 다른 사람들이 존재할 수 있습니다.

문자열 리터럴은 필요한 언어 연결을 나타냅니다. 이 국제 표준은 문자열 리터럴 "C"및 "C ++"의 의미를 지정합니다. "C"또는 "C ++"이외의 문자열 리터럴 사용은 구현 정의 시맨틱과 함께 조건부 지원됩니다. [참고 : 따라서 구현에 알려지지 않은 문자열 리터럴을 사용하는 연결 사양에는 진단이 필요합니다. — end note] [참고 : 문자열 리터럴의 철자는 해당 언어를 정의하는 문서에서 가져 오는 것이 좋습니다. 빈티지에 따라 ADA (ADA 아님) 및 Fortran 또는 FORTRAN이 있습니다. — 끝 참고]


1
이것은 어디에서 인용 되었습니까?
paul

@paul c ++ 11 표준 초안
aaronman

9

많은 (대부분의) 환경에서 "외부"C "는 시스템의 모든 언어에 대한 기본 연결 규칙입니다.

따라서 운영 체제 및 "외국어" "extern C"구현에 따라 컴파일 된 다른 언어로 프로그램을 호출하면됩니다.


C 연결을 사용하지 않는 환경 (파스칼, 즉 종종 스택에서 다른 인수 순서를 사용하고 수신자가 값을 해제해야 함)에도 C 호환 모드가 있습니다
johannes

@johannes : 실제로 Windows는 많은 것들에 Pascal 규칙을 사용하지만 C에서도 C가 필요하고 "C extern "Language"구문이 필요하지 않기 때문에 플랫폼 별 C 확장을 통해 수행하므로 C ++의 경우 여전히 extern "C"특별하고 특별합니다. 키워드는 다른 호출 규칙을 지정합니다.
Jan Hudec

1
여전히 컴파일러 공급 업체가 특수 연결 유형을 추가하는 경우가 있습니다. 다른 언어와의 상호 운용성 외에도 다른 C ++ 이름 관리와의 상호 운용성에 흥미가있을 수 있습니다. 질문은 :)
johannes


-4
  • 아니! C ++는 "연결 언어"로 C 만 지원합니다.

  • extern "C"{struct bar {/ * ... * /}}

  • 위의 구문은 변수, 구조체 또는 함수의 이름을 변경하지 않음을 의미합니다. C ++는 변수, 구조체 또는 함수의 이름을 변경하여 클래스, 네임 스페이스 및 함수 오버로드를 구현할 수 있습니다.

  • 이 작업을 수행하지 않으면 링커에서 변수의 객체, 함수의 구조체를 찾을 수 없습니다.

  • C ++는 C와 호환되도록 설계되었습니다. extern "C"는 C와 호환되도록 구현하는 방법입니다.


10
C ++ 표준의 §7.5를 확인하십시오. extern "C"그리고 extern "C++"유일한 필수 것들,하지만 구현은 다른 사람을 제공 할 수 있습니다.
johannes
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.