如何用__attribute __((__ packed__))struct的成员纠正g ++的引用参数错误?

时间:2014-09-05 01:45:24

标签: c++ struct

在我问a similar question后,我进一步尝试了一个压缩结构中更简单的成员变量,我得到了同样的错误。我很困惑!

编译以下代码时:

struct TupleHeader {
  int  tuple_stime; 
}__attribute__((__packed__));

void set_value(int& stime){
}

int main(){
    TupleHeader tuple;
    set_value(tuple.tuple_stime);
    return 0;
}

我收到了错误:

[borealis@localhost cpp-program]$ g++ attribute-1.cc 
attribute-1.cc: In function `int main()':
attribute-1.cc:13: error: cannot bind packed field `tuple.TupleHeader::tuple_stime' to `int&'

将功能定义set_value(int& stime)更改为set_value(int stime)后,错误消失了。我想问一下,除了修改set_value(int& stime)之外还有其他方法吗?

2 个答案:

答案 0 :(得分:2)

GCC似乎没有抱怨#pragma pack

#pragma pack(push, 1)
struct TupleHeader {
  int  tuple_stime; 
};
#pragma pack(pop)

另一种选择是演员

set_value(reinterpret_cast<int&>(tuple.tuple_stime));

根据您的平台对齐要求,可能不安全(即您可能不应该首先这样做)。

答案 1 :(得分:2)

据我所知,你的解决方案甚至不是一个有效的解决方案,因为通过应用它你完全打破你的程序。

最好的办法是发送对整个TupleHeader的引用,并在.tuple_stime之后访问set_value ...当然,在给它一个描述性名称之后。