在我问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)
之外还有其他方法吗?
答案 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
...当然,在给它一个描述性名称之后。