c - #Pragma pack 编译时发出警告

标签 c sockets struct pragma pack

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

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

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

#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 --version 
gcc (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4

最佳答案

GCC manual 相比,您的 pushpack 语法是倒退的表示支持。 #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 结构就是这样一种结构,尽管我认为打包它没有任何好处,因为它不是通过网络发送的),但是 Packet 结构在打包和解包形式中的布局相同。

关于c - #Pragma pack 编译时发出警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33611737/

相关文章:

c - 缓冲区溢出期间 EIP 值不正确

c++ - 如何在断开连接后干净地重新连接 boost::socket?

java - 使用连接构造函数创建的套接字的连接超时是多少?

arrays - 为什么不能超过 *[]Struct?

c++ - 结构静态成员含义/定义

c - strstr 用于 OR 搜索?

c - C 中的字符串文字以 %?

c - 如何构建一个类型以传递给一个 DLL 函数,该函数采用指向内部数组的结构的指针?

sockets - Skype和所有其他p2p程序如何工作而不被阻止?

c - 需要对指向结构的动态指针数组进行排序,其中可能包含 NULL 指针