C ++ 코드를 C API로 공개적으로 노출한다는 것은 무엇을 의미하며 그 이점은 무엇입니까?


25

사람들은 C ++ 프로그래머가 라이브러리 / 제품의 공개 API를 C API로 공개해야한다고 말합니다.

그것은 무엇을 의미하며 그 장점은 무엇입니까?

답변:


44

인터페이스로 노출되는 라이브러리 부분은 언어의 C "부분"만 사용하므로 클래스 또는 유사한 함수, POD 및 POD를 포함하는 구조체 만 내 보내지 않습니다. 또한 일반적으로 함수를로 표시하여 C ++ 이름 맹 글링을 비활성화해야합니다 extern "C". 일반적인 예는 다음과 같습니다.

extern "C" void foo(int bar);

이러한 방식으로 라이브러리를 노출하면 얻을 수있는 가장 큰 장점은 거의 모든 프로그래밍 언어가 C 라이브러리와 직접 인터페이스 할 수있는 메커니즘이 있지만 C ++ 라이브러리와 직접 인터페이스 할 수있는 사람은 거의 없다는 것입니다. 그런 의미에서 가장 낮은 공통 분모를 사용하여 다른 사람들이 라이브러리를 쉽게 사용할 수 있습니다.

그러나 다른 사람들이 사용할 수있는 라이브러리를 생성하는 경우 이는 실제로 유용한 전략 일뿐입니다. C ++ 전용 소프트웨어를 구축 중이고 라이브러리가 서로 인터페이스하기 만하면되는 경우 (IMHO) 적절한 C ++ API를 노출하는 것이 좋습니다. 따라서 언어의 모든 기능을 활용할 수 있습니다.


14
throw 된 예외도 내 보내지 않도록주의해야합니다!
James

좋은 답변입니다. extern "C"내가 얻지 못한 것들 의 예를 들어 줄 수 있습니까?
Daniel Ribeiro

1
@DanielRibeiro : "extern C"를위한 구글. 다음과 같은 링크를 찾으실 수 있습니다. stackoverflow.com/questions/1041866/…
Doc Brown

1
@DanielRibeiro, 매우 간단한 예가 추가되었습니다.
Timo Geusch

1
@DanielRibeiro 기술적으로 여전히 사용할 수 .hpp있지만이 확장명은 "C ++ 헤더 파일"을 의미하므로 .hC 및 C ++ 모두에 사용 되어야합니다 .
leemes

8

Timo의 답변 외에도 일부 플랫폼 (예 : Windows-Mac OS X의 Linux와 같은 일부 플랫폼)에는 표준화 된 C ++ ABI가 없으므로 기능이 누락되었을뿐만 아니라 그러한 기능을 구현할 수 없습니다.

예를 들어 IIRC MSVC는 각 버전마다 다른 ABI를 가지고 있으며 디버그 또는 릴리스 빌드인지에 따라 변경 될 수 있으며 게시되지 않으므로 타사 컴파일러는 일반적으로 호환되지 않습니다 (일부 버전의 icc는 MSVC와 호환된다는 정보를 읽습니다) 2005 년이지만 NDA에 의해 공개 된 정보 일 수 있습니다. Python을 만든 제작자에게는 필요하지 않습니다.) 및 자체 ABI를 사용하십시오. 따라서 실제로 언어 환경은 컴파일러 버전뿐만 아니라 플래그도 제한합니다.

마지막으로 C ++에는 훨씬 더 많은 컴파일 타임 기능이 있습니다. 예를 들어 제네릭은 일반적으로 동적 형식 언어 등에는 존재하지 않습니다.


2
@DanielRibeiro : C ++ ABI의 멋진 지옥에 오신 것을 환영합니다 ( en.wikipedia.org/wiki/Application_binary_interface ). 짧은 버전은 C ++ 구성 요소를 개별적으로 컴파일 (다른 컴파일러 / 플래그로 컴파일)하여 자동으로 실패 / 충돌하는 대신 함께 작동하게 만드는 것이 매우 어렵다는 것입니다.
Maciej Piechotka
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.