#Pragma pack 编译时发出警告

cod*_*lyf 3 c sockets struct pragma pack

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

warning: ignoring #pragma ( [-Wunknown-pragmas] #pragma(pack);`
Run Code Online (Sandbox Code Playgroud)

为什么我的编译指示被忽略?以及如何解决这个问题。

#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)
Run Code Online (Sandbox Code Playgroud)

gcc 版本:

gcc --version 
gcc (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4
Run Code Online (Sandbox Code Playgroud)

Jon*_*ler 5

pushGCC 手册所说的支持pack相比,您的and语法是倒退的。后面的分号是多余的。#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)
Run Code Online (Sandbox Code Playgroud)

虽然链接是 GCC 5.2.0 文档,但如果将 URL 中的 5.2.0 更改为 4.8.4 也是一样的。

顺便说一下,对于Packet所示的数据结构,打包结构的方向在任何合理的机器架构上都是多余的。有很多结构不是这种情况(实际上,PacketNode结构就是这样一种,尽管我认为打包它没有好处,因为它不是通过电线发送的),但Packet结构在布局上是相同的和解压缩的表格。