当我编译以下代码时:

#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.2g++-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 仅分配 20 位!)

另一方面,如果您不关心 timeval 内是否有填充——仅在它和其他结构之间——您的另一个选择是将其声明为 char tuple_stime[sizeof(timeval)],并根据需要进行转换。 (不要忘记别名问题。)

10-08 14:27