为了账号安全,请及时绑定邮箱和手机立即绑定

Visual C ++相当于GCC的__attribute __((__ package ___))

Visual C ++相当于GCC的__attribute __((__ package ___))

C++ C
慕桂英4014372 2019-08-27 17:43:17
Visual C ++相当于GCC的__attribute __((__ package ___))对于某些编译器,有一个结构的打包说明符,例如::RealView ARM编译器有“__packed”Gnu C编译器有“__attribute __((__ package ___))”Visual C ++没有等价物,它只有“#pragma pack(1)”我需要一些我可以放入结构定义的东西。任何信息/黑客/建议?TIA ...
查看完整描述

3 回答

?
噜噜哒

TA贡献1784条经验 获得超7个赞

我不知道这样做的光滑方式,但你可能会做一些可怕的事情:

#include "packed.h"struct Foo { /* members go here */ } PACKED;#include "endpacked.h"

那么对于MSVC,packed.h:

#define PACKED#pragma pack(push,1)

endpacked.h

#pragma pack(pop)#undef PACKED

对于gcc,packed.h:

#define PACKED __attribute__ ((__packed__))

endpacked.h:

#undef PACKED

从根本上说,包装过于依赖平台。假设您的压缩结构中包含8位字段,并考虑一些具有16位字节的系统。它只能通过打包来形成一个表示数据的结构 - 你必须知道在两个系统之间传输时如何将8位字节转换为16位字节。16位机器上的结构可能需要位域,在这种情况下,您必须知道实现如何实现它们。

因此,如果代码通常是可移植的,您可能只需要在头文件的特定于平台的部分中定义所需的任何打包结构。或者更确切地说,构造您的代码,以便未来的端口可以做到这一点,如果必须的话。


查看完整回答
反对 回复 2019-08-27
?
潇湘沐

TA贡献1816条经验 获得超6个赞

您可以为GNU gcc定义这样的PACK

#define PACK( __Declaration__ ) __Declaration__ __attribute__((__packed__))

和Visual C ++一样:

#define PACK( __Declaration__ ) __pragma( pack(push, 1) ) __Declaration__ __pragma( pack(pop) )

并像这样使用它:

PACK(struct myStruct{
    int a;
    int b;});


查看完整回答
反对 回复 2019-08-27
  • 3 回答
  • 0 关注
  • 1089 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信