2014-02-20 31 views
2

我就在C网络数据包模拟器的工作,需要使用几个不同struct定义,例如:的#pragma包VS -fpack-结构的英特尔C

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

默认情况下,编译器(英特尔)会在bc之后添加缓冲区,因此我可以使用#pragma pack预处理器命令或将-fpack-struct添加到编译器标志。由于我在程序中有几个类似的结构,我想使用-fpack-struct。除了减慢IO的速度之外,使用标志而不是预处理器命令有什么缺点吗?

回答

1

#pragma是源代码的一部分,有助于记录实际结构的布局。如果它在外部的Makefile或编译器选项中,则通过阅读代码的布局是不明显的。

如果需要,其他编译器可以使用条件编译指示来准确支持它。事实证明,Borland,gcc和VC支持#pragma pack()。也许甚至英特尔:

#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代码中看到该编译指示。铛没有记录-fpack-struct。现在您可以开始列出很多不同的编译器,以及它们的打包机制。