我正在使用C语言中的网络数据包模拟器,这需要使用几个不同的struct
定义,例如:
struct DMPacketStruct
{
short int header[8];
short int a;
unsigned char b;
short int c;
}DMPacket;
默认情况下,编译器(Intel)会在b
和c
之后添加缓冲区,因此我可以使用#pragma pack
预处理器命令或添加-fpack-struct
编译器标志。由于我在程序中有几个类似的结构,我想使用-fpack-struct
。除了减慢我的IO之外,使用标志而不是预处理器命令有什么缺点吗?
答案 0 :(得分:1)
在这种情况下没有。但是你必须记住,这两个选项都是特定于编译器的。据我所知,gcc也支持-fpack-struct
,但我从未在gcc代码中看到过该编译指示。 clang没有记录-fpack-struct
。您现在可以开始列出许多不同的编译器以及它们的打包机制。
答案 1 :(得分: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