#Pragma pack在编译时发出警告

时间:2015-11-09 14:49:22

标签: c sockets struct pragma pack

我在C中创建以下结构,只有Packet结构将通过UDP套接字发送。我想打包结构以避免在不同的计算机上进行不同的对齐(不确定我是否需要打包两个或只发送一个我发送的那个)。当我编译它时,我得到以下两个警告:

warning: ignoring #pragma ( [-Wunknown-pragmas] #pragma(pack);`

为什么我的pragma被忽略了?如何解决这个问题。

#pragma push(pack, 1);
struct packet{ // the actual packet within the node
    uint32_t seqnum;
    uint32_t checkSum;
    uint32_t numPackets; // number of packets to send
    char data[1024]; // the data in the packet
};
struct packetNode{ //for the linked list
    struct packet p;
    struct packetNode *next;
};
#pragma pop(pack)

gcc版本:

gcc --version 
gcc (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4

1 个答案:

答案 0 :(得分:3)

您的pushpack语法与GCC manual所支持的语法相比较向后。 #pragma之后的分号是多余的。

#include <inttypes.h>

#pragma pack(push, 1)
struct packet{ // the actual packet within the node
    uint32_t seqnum;
    uint32_t checkSum;
    uint32_t numPackets; // number of packets to send
    char data[1024]; // the data in the packet
};
struct packetNode{ //for the linked list
    struct packet p;
    struct packetNode *next;
};
#pragma pack(pop)

虽然该链接指向GCC 5.2.0文档,但如果您将URL中的5.2.0更改为4.8.4,则相同。

顺便提一下,对于所示的Packet数据结构,在任何合理的机器架构上打包结构的方向都是多余的。有很多结构不会出现这种情况(事实上,PacketNode结构就是这样的结构,虽然我认为打包它没有任何好处,因为它不是通过电线发送的),而是{{1}在打包和未打包的表单中,结构的布局都是相同的。