2012-04-04 3 views
9

g ++ - 4.7 및 -std = C++ 0x를 사용하여 C++ 11에서 응용 프로그램을 개발 중입니다.
내 앱은 g ++ - 4.7로 컴파일되었지만 -std = C++ 0x 지시어가없는 공유 라이브러리에 연결됩니다.C++ 11과 C++ 03 사이의 라이브러리 호환성

외부 라이브러리 클래스 및 메서드를 사용할 때 이상한 동작이 발생한다는 것은 의미가 없습니다. (물론 내 응용 프로그램을 컴파일하지 않고 -std = C++ 0x는 정상적으로 작동합니다.)

  1. 예상되는 동작입니까 아니면 컴파일러 버그입니까?

  2. 모든 대안 (C 키워드 extern과 같은)?

+1

왜'-std = C++ 0x'로 라이브러리를 다시 컴파일 할 수 없습니까? – leftaroundabout

+4

하나의 TU를 라이브러리 헤더의 한보기와 ​​다른보기의 다른 TU로 컴파일하면 모든 번역 단위에 동일한 코드가 표시된다는 것은 분명히 위반됩니다. –

+1

다른 플래그로 컴파일하는 것은 정신 이상에 대한 가장 짧은 길 중 하나입니다. 경고 및 최적화 수준은 다소 차이가 있지만, 소스 코드의 해석이나 생성 된 바이너리의 레이아웃에 영향을 줄 때 ... 콧노래. –

답변

10

표준 라이브러리가 변경되었으며 -std=c++0x 컴파일러 플래그가 라이브러리의 사용 부분을 결정합니다. 동일한 프로그램에서 두 버전을 모두 사용하려고 시도하면 하나의 정의 규칙을 위반하게됩니다. 표준 라이브러리의 각 요소에 대해 동일한 식별자에 대해 두 가지 정의가 있습니다.

나는이 제한을 극복하기 위해 할 수있는 간단한 것은 없다고 생각합니다. 라이브러리의 한 버전 (즉, 표준 헤더를 포함하기 전에 해당 매크로를 정의하여 해당 라이브러리 내부에서 C++ 11을 비활성화 할 수 있음)을 보장해야합니다. 그래도 생성 된 코드가 여전히 유효하지는 않은지 확신 할 수 없습니다 ODR을 중단하십시오 (C++ 11 확장이 C++ 03 라이브러리 코드를 다르게 컴파일하는 경우).