【问题标题】:what is the difference between __attribute__((__packed__)); and #pragma pack(1)__attribute__((__packed__)); 有什么区别?和#pragma pack(1)
【发布时间】:2015-11-19 10:35:13
【问题描述】:

我正在将在 Linux 上完美运行的代码移植到 windows visual c++。 我在 Linux 中有这段代码:

struct exif_desc
{
    uint16_t  tag;
    uint16_t  type;
    uint32_t  length;
    uint32_t  value;
}
__attribute__((__packed__));

我在 Windows 上遇到错误:

'__packed__' : undeclared identifier 

我想知道是否可以通过使用来修复此错误

#pragma pack(1)

它们之间有什么区别吗?是否有任何语法可以在 Linux 和 Windows 中用于此属性?

【问题讨论】:

标签: c++ linux windows pragma-pack


【解决方案1】:

__attribute__ 是 GCC 扩展,特定于 GCC(以及其他试图与 GCC 兼容的编译器)。

#pragma pack 最初是 Visual C++ 编译器特定的扩展。正如评论者所指出的,它也已在 GCC 中实现,以实现 VC++ 兼容性。

通常,您不能在另一个编译器中的一个编译器中使用扩展。恰当的例子:__attribute__ 在 Visual C++ 编译器中不作为扩展存在。

【讨论】:

  • #pragma pack 也可以在 gcc 中使用 (gcc.gnu.org/onlinedocs/gcc/Structure-Packing-Pragmas.html)
  • #pragma pack 是非标准扩展,但适用于大多数编译器
  • 还要注意#pragma pack 从定义点开始生效,直到另一个#pragma 包,而__attribute__((__packed__)) 仅对它所附加的定义有效。这很重要。
猜你喜欢
  • 2016-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-01
  • 1970-01-01
  • 2012-01-24
  • 1970-01-01
相关资源
最近更新 更多