2012-04-24 3 views
9

예를 들어 공유 라이브러리에 해당하는 다음 헤더 파일을 가정합니다. 공유 라이브러리가 하나의 컴파일러를 사용하여 구축 한 후 때문에 다른의 작동하지 않을 수 있습니다 다른 컴파일러를 사용하여 내장 된 C 코드에서 사용하는 경우컴파일러 간 구조체 정렬 및 이식성

// lib.h 

typedef struct { 
    char c; 
    double d; 
    int i; 
} A; 

DLL_EXPORT void f(A* p); 

: 내 보낸 함수는이 헤더에 정의 된 사용자 정의 구조에 대한 포인터를 취 메모리 정렬, Memory alignment in C-structs 제안합니다. 그렇다면 같은 구조의 다른 컴파일러에서 구조 정의를 이식 할 수있는 방법이 있습니까?

나는 분명히 다른 플랫폼에 대해서도 배우기는하지만 윈도우 플랫폼 (분명히 잘 정의 된 ABI가 없다)에 관심이있다.

+3

아니요, 누군가가 보증하지 않는 한 아니요. –

+3

중복되지 않습니다. 적어도 선택한 질문이 아닙니다. 이것은 독자적으로 설 수 있습니다. –

+1

"struct alignment"라는 단어가 다른 질문과 관련이없는 경우에도 자동으로 그 질문의 중복이 있습니까? –

답변

11

TL; 실제로 당신은 괜찮을 것입니다.

C 표준은이를 정의하지 않지만 플랫폼 ABI는 일반적으로이를 정의합니다. 즉, 주어진 CPU 아키텍처와 운영 체제에 대해 C가 서로 다른 컴파일러가 상호 운용되도록 어셈블리에 매핑하는 방법에 대한 정의가있을 수 있습니다.

구조체 정렬은 플랫폼 ABI에서 정의해야하는 유일한 것이 아니며, 함수 호출 규칙 및 이와 유사한 요소가 있습니다.

C++는 그것을 더욱 복잡하게하고, ABI 내가 여러 C++ ABI를 컴파일러에 따라이 있다고 생각 Windows에서 등 vtable을, 예외 이름 맹 글링,

를 지정해야하지만, C는 컴파일러에서 대부분 호환됩니다. Windows 전문가가 아니라 내가 틀릴 수도 있습니다.

일부 링크 :

어쨌든 결론은 당신은 당신의 보증을 찾는 것을 플랫폼/컴파일러 ABI 사양, C 표준이 아닙니다.

+0

제 질문은 C++에 전혀 영향을주지 않지만 여러분의 노력에 감사드립니다. ABI에 대해서도 알고 있습니다. Windows에서 ABI 사양에 대해 들어 본 적이 없기 때문에 Windows 관련 질문을 표시 한 것입니다. –

+0

@ 7vies : C에는 ABI도 있습니다 (다른 호출 규칙, cdecl, stdcall, fastcall을 생각해보십시오). OS가 시스템 호출에 기대하는 것과 일치하는 것보다 다른 이유가 없다면 다른 컴파일러는 일반적으로 (보통 "일반적인"호출 규칙에서) 동일합니다. C++에서 여러 컴파일러는 동일한 API, 특히 외부 이름에 동의하지 않는 경우가 많습니다. –

+0

@MichaelBurr, 사이드 노트로, 위키 백과는 이것들이 _x86_ 협약이라고 말하며 다른 아키텍처에서도 사용됩니까? 나는 C++ 이슈를 알고있다. 그래서 그것이 순수한 C로 동작하도록 만드는 방법을 묻는다. 호출 규칙은 포터블 인터페이스를 정의하는 데 도움이되지만, 구조 조정에 대한 나의 문제를 해결하지는 못한다. –

1

동일한 컴파일러를 사용하더라도 빌드에서 사용 된 다른 컴파일러 스위치로 인해 또는 동일한 컴파일러와 동일한 스위치의 다른 버전을 사용하는 경우 차이가있을 수 있습니다 (내가 일한 임베디드 컴파일러).

구조체가 정확히 동일하게 표시되도록하려면 스위치, #pragma를 사용해야합니다.

내 충고 -이 모든 것을 방해하십시오. struct 내에서 래핑되지 않은 함수에서 인수를 전달하십시오.

두 개의 컴파일러를 다루는 경우에도이 간단한 형식으로도 간단하지 않습니다. 예를 들어, int가 같은 수의 바이트를 사용하는지 확인해야합니다. 또한 호출 순서 - 인수 순서 - 왼쪽에서 오른쪽 또는 오른쪽에서 왼쪽으로 - 컴파일러에 따라 다를 수 있습니다.

3

확실히 알 수있는 유일한 방법은 해당 컴파일러의 설명서를 참조하는 것입니다.그러나 일반적으로 C 구조체 레이아웃 (사용하는 환경을 제외하고 ABI 설명에서 정의한대로 비트 필드 용으로 제외)이 있으며 C 컴파일러는 기본 ABI를 따르는 경향이 있습니다.