【问题标题】:#Pragma pack giving warning when compiling#Pragma 包在编译时发出警告
【发布时间】:2015-11-09 14:49:22
【问题描述】:

我在 C 中创建以下结构,只有 Packet 结构将通过 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 版本:

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

【问题讨论】:

  • 可能是因为你的编译器不支持#pragma
  • 与问题没有直接关系,但如果您关心不同计算机之间的互操作性,您是否考虑过发送方和接收方之间的不同字节序?
  • 是的,我在发送之前对数据猫执行 htonl(),在接收时我执行 ntohl()

标签: c sockets struct pragma pack


【解决方案1】:

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 结构将是包装形式和未包装形式的布局相同。

【讨论】:

  • 感谢您的回答。不幸的是,我修复了它,但我仍然收到相同的警告:/
  • @Rachelle:好奇:structure packing pragmas 上的 GCC 4.8.4 手册说应该没问题。我在答案中使用 5.2.0 和编译选项 gcc -O3 -g -std=c11 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes -Wold-style-definition -Werror -c pack.c 测试了粘贴的代码——pack.c 正是显示的代码——并且没有收到警告或错误(但原始代码无法编译)。检查您的行号;检查您是否删除了分号;检查您编辑的文件是否正确。
猜你喜欢
  • 2019-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-13
  • 2020-07-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多