当我编译以下代码时:
#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和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,并将上面代码中的所有时间变为timeval2:
struct timeval2
{
__time_t tv_sec;
__suseconds_t tv_usec;
}__attribute__((__packed__));
错误消失了,但我不想定义已经存在于< bits / time.h>中的结构. .有哪些其他方法可以纠正此错误?非常感谢!
最佳答案 这取决于你想要什么.如果你想要内部timeval也是紧凑的,重复结构声明几乎是你唯一的选择:default-packed结构和紧密结构的结构具有相同名称的成员,但是包装的不同使它们成为根本不同的类型. (FWIW,因为你显然想要节省空间,你可以借此机会使它成为一个位域,并且分配tv_usec只有二十位!)
另一方面,如果你不关心在timeval中有填充 – 只在它和其他结构之间 – 你的另一个选择是将它声明为char tuple_stime [sizeof(timeval)]而不是如有必要. (不要忘记别名问题.)