2014-02-20 2 views
2
예를 들어, 여러 가지 struct 정의의 사용을 필요로 내가 C에서 네트워크 패킷 시뮬레이터 일하고

: 기본적으로의 #pragma 팩 인텔 C

struct DMPacketStruct 
{ 
    short int header[8]; 
    short int a; 
    unsigned char b; 
    short int c; 
}DMPacket; 

, 컴파일러 (Intel)은 bc 이후에 버퍼를 추가하므로 #pragma pack 사전 처리기 명령을 사용하거나 -fpack-struct을 컴파일러 플래그에 추가 할 수 있습니다. 프로그램에 몇 가지 유사한 구조가 있으므로 -fpack-struct을 사용하고 싶습니다. 내 IO의 속도를 늦추는 것 외에도 프리 프로세서 명령 대신 플래그를 사용하는 데는 단점이 있습니까?

답변

1

#pragma는 소스 코드의 일부이며 실제 구조의 레이아웃을 문서화하는 데 도움이됩니다. 그것이 Makefile이나 컴파일러 옵션 외부에 있다면, 레이아웃이 무엇인지 코드를 읽는 것만으로는 분명치 않다.

필요한 경우 다른 컴파일러가 조건부 pragma로 정확하게 지원할 수 있습니다. 결국 #pragma pack()은 Borland, gcc 및 VC에서 지원됩니다. 어쩌면 인텔 :

#if defined(__INTELC_) || defined(__BORLANDC__) || defined(__MSVC__) 
#pragma pack(1) 
#elif defined(__SOME_OTHER_C__) 
#pragma struct packing(0) 
... 
#endif 
+1

저는 컴파일러 호환성에 대해서 생각조차하지 않았습니다. 통찰력에 감사드립니다. – DavidH

1

이 경우에는 없습니다. 그러나 두 옵션 모두 컴파일러에 따라 다르다는 점을 유념해야합니다. 내가 아는 한 gcc도 -fpack-struct을 지원하지만 gcc 코드에서는 그 pragma를 본 적이 없다. clang은 -fpack-struct을 문서화하지 않았습니다. 이제 많은 다른 컴파일러를 나열하고 포장 작업이 어떻게 작동하는지 알 수 있습니다.