2013-08-07 8 views
4

C++ 11 ("lambdas"를 사용합니다)의 코드를 ".o"또는 "aa"라이브러리로 컴파일한다고 가정합니다. 그리고 이전 라이브러리 및 헤더 파일을 포함 할 프로그램이 있는데 C++ 11에서는 컴파일 할 수 없지만 이전 프로그램 (C++ 98)에서는 컴파일 할 수 없습니다. 컴파일되어 제대로 작동합니까?C++ 11 코드/라이브러리가 아닌 C++ 11 프로그램

+0

음, 헤더가 C++ 11을 사용합니까? – Cameron

+3

여기에 좋은 정보가 있습니다 : http://gcc.gnu.org/wiki/Cxx11AbiCompatibility –

+0

@Cameron Header에는 코드 구현이 없습니다. – WaciX

답변

3

아마도 그렇지 않습니다. C++에서 이름 변환 (왜 ABI가 변경되는지)이 존재하는 이유는 C++ 버전 간의 비 호환성으로 인해 코드가 불안정해질 수 있기 때문입니다.

C++ 11에 대해 컴파일하지 않는 코드가있는 경우 다른 컴파일러와 비교하여 컴파일 할 프로그램 중 하나를 리팩터링해야 할 수 있습니다. (대부분의 경우 새 컴파일러로 이전 코드를 컴파일해야합니다.)

이 옵션이 아닌 경우 C++ 11 lib에 C 인터페이스 또는 COM 개체 인터페이스가있는 DLL을 만들 수 있습니다. 그러나 예외가 경계에서 멈출 것이고 DLL 경로를 사용하면 C++ 11 객체에 액세스 할 수있는 래퍼 클래스를 작성하여 pre C++ 11에서 객체처럼 작동 할 수 있습니다. 경계의 측면.

2

경우는 잘 작동합니다 :

  1. (공개) 헤더에 플랫폼/컴파일러를 참조 ABI의이
    • 변경되지 않았습니다
    • 어떤 C++ 11 기능을 사용하지 않습니다 이와
  2. 공통 의존성은 GCC 문서 당
    • 변경 없다 Vaughn Cato가 연결된 에는 표준 라이브러리이 포함되어 있습니다. C++ 11로 컴파일 할 때 다른 코드 또는 객체 레이아웃을 생성하고 라이브러리와 클라이언트 모두에서 사용되는 것은 문제 일 수 있습니다 ... 인터페이스 자체에서 사용되지 않는 경우에도 문제가 될 수 있습니다.

점 (3)이 유일한 문제가 있다면, 당신은 플랫폼에서 .so를, 또는 .dynlib, 또는 아드리안 같은 DLL을 따라 (동적 라이브러리를 컴파일하여 주위를받을 수 있습니다 내부적으로 정적으로 링크되고 내보내지지 않은 모든 의존성을 가진). 그래도 조금 털이 많습니다.

+0

스마트 포인터의 사용 및 동작과 같은 일부 경우가 있다고 생각합니다. 다른 언어 버전의 "일반적인"포인터로 볼 수있는 스마트 포인터의 가능한 문제점을 설명하는 게시물을 여기 기억합니다. . – user2485710

+0

이것이 실제로 가장 좋은 답변이며, 저를 구해주었습니다.나는 C++ 11 라이브러리가 C++ 03 런타임에 링크 된 응용 프로그램을 사용하여 많은 C++ 11 기능을 손상시킬 수 있다고 덧붙였습니다. std :: current_exception()은 제대로 작동하지 않을 수 있습니다. C++ 11 라이브러리를 C++ 11 컴파일 런타임에 연결하면 컴파일 된 응용 프로그램이 의도 한대로 작동합니다. 즉, 최신 C++ 컴파일러와 STL (모든 컴파일에서 동일한 버전 유지)을 사용하면 성공할 가능성이 큽니다. 니올 –

1

한 가지 공통적 인 접근 방법은 불투명 포인터를 사용하여 객체가 전달 된 C 버전의 API (extern "C" 함수)를 제공하는 것입니다. 이것은 언어와 컴파일러간에 호환 가능성이 높습니다.