2014-01-29 3 views
5

매우 간단한 질문 : 동일한 시스템에서 C int이 C++ int과 동일한 것을 보증합니까?C 및 C++ 유형의 상호 운용성

물론 이것은 물론 이론적 인 질문입니다.

C 및 C++ 표준은 동일한 언어를 사용하여 기본 유형을 정의합니다. 포트란 2003

use ISO_C_BINDING 
integer(kind=c_int) :: i 

는 "동반자 C 프로세서"에 int 유형과 호환되는 정수 유형을 선언 분명히 것을 만드는 반면, 나는이 C++ 참고 표준에서 그러한 주장을 찾을 수 없습니다. Fortran이 C++보다 강력한 C 상호 운용성 보장을 제공한다는 것은 매우 이상한 것 같습니다!

내가 찾을 수있는 가장 가까운 모든 구현은 C 프로그래밍 작성된 함수에 연결를 제공해야한다

한다고 섹션 7.5 [dcl.link]는 C++ 11 표준의 제 3 항의하다 언어

그러나이 작은 문장은 기본 형식의 호환성을 보장 할 정도로 강하지는 않습니다.

C++ 표준에서 내가 간과 한 다른 언어가 있습니까? 아니면 아무도 명시 적으로 언급하지 않으려 고 당연히 당연한 것으로 받아 들여지고 있습니까?

EDIT : David Schwartz는 "동일한 시스템"이라고 말하면 주석이 잘못되었다고 지적합니다. 나는 실제로 하드웨어, OS, 시스템 라이브러리 등과 같은 "플랫폼"을 의미했습니다. 물론 ABI 문제입니다. 인용 된 구절에서 C++ 표준은 extern "C"을 사용하여 C 함수를 호출 할 수 있다는 것을 나타내려는 것 같습니다. 그러나 충분히 보장되는지 확실하지 않습니다.

+1

같은 시스템에서 같은 컴파일러 및 컴파일러 설정으로 * 확장 할 수 있습니다. 그렇지 않으면 대답은 분명히 아니오입니다 (64 비트 시스템에서 32 비트 int로 i386 바이너리를 컴파일 할 수 있음) –

+0

"같은 시스템"은 무엇을 의미합니까? 같은 하드웨어? 같은 OS인가요? 같은 컴파일러 스위트? 동일한 시스템 라이브러리? –

+2

아마도 3.9.1p3'부호가있는 부호없는 정수 유형은 C 표준 5.2.4.2.1 절에 주어진 제약 조건을 충족해야합니다. –

답변

5

번호

널리 기본적으로 64 비트로 long 32 비트 치료의 x64 AMD 호환 CPU에서 컴파일러와 다른 사람을 따르는이 사용된다. 따라서 C++ 및 C 컴파일러는 제외하고 동일한 시스템에있는 두 개의 C++ 컴파일러의 경우조차 마찬가지입니다.

하나의 컴파일러 내에서 호환되는 경우 컴파일러 공급 업체가 결정합니다. 그들은 보통 (항상) 있습니다. "하나의 컴파일러"는 약간의 잘못된 이름입니다. C snd C++ 컴파일러는 같은 벤더가 동일한 바이너리를 사용하더라도 어떤 의미에서든 다른 컴파일러입니다.

+0

대답은 정확합니다. C 및 C++ 표준은 비슷한 언어를 사용하며 모든 정수가 특정 크기임을 보장하지 않습니다. 필자는 비슷한 이유로 Fortran 컴파일러가 그 약속을 잘 수행 할 수 있다고 생각하지 않습니다. –