如何使用 __attribute__((__packed__)) 结构的成员更正有关 g++ 引用参数的错误?

How to correct a error about g++'s reference parameter with __attribute__((__packed__)) struct's member?

本文关键字:g++ 引用 参数 错误 成员 attribute 何使用 packed 结构      更新时间:2023-10-16

在我问了一个类似的问题之后,我进一步尝试在打包结构中更简单的成员变量,我得到了同样的错误。我很困惑!

编译以下代码时:

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)还有其他方法吗?

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

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

GCC 似乎并没有抱怨#pragma pack

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

另一种选择是演员表

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

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