2016-08-01 2 views
2

C 및 C++ 표준은 일부 데이터 유형의 정확한 길이를 지정하지 않으며 최소 길이 만 지정합니다.타사 라이브러리의 데이터 유형 길이가 다릅니다.

제 3 자 라이브러리 : someLib.lib (내 플랫폼 용으로 컴파일 됨) 및 그에 해당하는 someLib.h이 있습니다. 한 내가 int의를 사용할 수 있도록, 모든 것이 잘 컴파일해야

int getNumber(); 
void setNumber(int number); 

나는이 라이브러리를 소모하는 프로그램을 컴파일, 컴파일러는 someLib.h에 정의 된 서명 유형을 확인 :의는 다음과 같은 기능이 포함되어 있다고 가정 해 봅시다 .

하지만 내 컴파일러에서 int이 길거나 짧으면 컴파일 할 때 사용되는 컴파일은 someLib.lib일까요? 연결 중에 감지됩니까? 런타임 오류가 발생합니까? 컴파일 방법을 모른 채 someLib.lib을 안전하게 사용할 수 있습니까?

+0

'int'와 같은 간단한 유형에는 거의 문제가 없습니다. 이런 종류의 문제가 나타나는 곳은 컴파일러의 차이점이나 동일한 컴파일러의 다른 옵션에 따라 다른 패딩이있는 구조입니다. 또는 비트 필드와 같은 구현 정의 세부 사항이있는 기능으로 구현할 수 있습니다. 이것이 라이브러리 내에서 이러한 세부 사항을 포함하는 불투명 한 인터페이스를 갖는 한 가지 이유입니다. –

답변

3

컴파일러 또는 링커 오류가 발생하지 않아야하며 런타임에는 정의되지 않은 동작 만 수행하면 안됩니다. 아마도 충돌 할 수도 있고 운 좋은 운 좋은 결과 일 수도 있습니다.

+3

이상한 결과를 얻으면 운이 좋으면 운이 좋으면 운이 좋다. – Jovasa

1

기본 시스템이나 컴파일러에 대한 제한된 가정을 가지고있는 라이브러리를 사용하면 문제가 발생할 수 있습니다.

따라서 사용중인 라이브러리가 int이 16 비트라고 가정했지만 32 비트 시스템에서 사용하는 경우 런타임에 문제가 발생합니다.

좋은 구현 라이브러리는 이러한 문제를 최소화하기 위해 #if 매크로를 사용하거나 다른 시스템에 다양한 .lib 파일을 구현했습니다. 그들은 더 이식성을 위해 명시 적으로 intX_t (예 : int32_t) 정수를 사용할 수도 있습니다.

관련 문제