__attribute__((__packed__)); 和有什么区别 和#pragma pack(1)

man*_*ans 6 c++ linux windows pragma-pack

我正在将在 Linux 上完美运行的代码移植到 Windows Visual C++。我在 Linux 中有这样的代码:

struct exif_desc
{
    uint16_t  tag;
    uint16_t  type;
    uint32_t  length;
    uint32_t  value;
}
__attribute__((__packed__));
Run Code Online (Sandbox Code Playgroud)

我在 Windows 上遇到错误:

'__packed__' : undeclared identifier 
Run Code Online (Sandbox Code Playgroud)

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

#pragma pack(1)
Run Code Online (Sandbox Code Playgroud)

他们之间有什么区别吗?Linux 和 Windows 中是否有可用于此属性的语法?

Som*_*ude 3

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

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

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

  • 另请注意,“#pragma pack”从定义点开始生效,直到另一个 #pragma pack,而“__attribute__((__packed__))”仅对其所附加的定义有效。这个很重要。 (9认同)
  • #pragma pack 也可以在 gcc 中使用 (https://gcc.gnu.org/onlinedocs/gcc/Structure-Packing-Pragmas.html) (3认同)
  • #pragma pack 是非标准扩展,但适用于大多数编译器 (2认同)