当我编译以下代码时:
#include <sys/time.h>
#include <stdio.h>
struct TupleHeader {
timeval tuple_stime; // 34..37
}__attribute__((__packed__));
void set_value(timeval& stime){
}
int main(){
TupleHeader tuple;
set_value(tuple.tuple_stime);
return 0;
}
我收到以下错误g++-3.4.2
and g++-4.8.3
:
attribute-1.cc: In function `int main()':
attribute-1.cc:13: error: cannot bind packed field `tuple.TupleHeader::tuple_stime' to `timeval&'
我定义之后timeval
我自己如下并更改了所有timevals
在上面的代码中写入timeval2
:
struct timeval2
{
__time_t tv_sec;
__suseconds_t tv_usec;
}__attribute__((__packed__));
错误消失了,但我不想定义一个已经存在于的结构<bits/time.h>
。还有哪些其他方法可以纠正此错误?多谢!
这取决于你想要什么。如果您希望内部 timeval 也紧密包装,那么重复结构声明几乎是您唯一的选择:默认包装结构和紧密包装结构具有相同名称的成员,但包装的差异使它们根本上不同的类型。 (FWIW,由于您显然是在尝试节省空间,因此您可以借此机会将其设为位字段,并分配tv_usec
只有二十位!)
另一方面,如果您不关心 timeval 内的填充(仅在它和其他结构之间),您的另一个选择是将其声明为char tuple_stime[sizeof(timeval)]
相反,并根据需要进行投射。 (不要忘记别名问题。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)