有关__attribute __((__ packed__))的c ++编译错误的其他方法是什么?

时间:2014-09-04 15:46:49

标签: c++ g++

当我编译以下代码时:

#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>中已存在的结构。有哪些其他方法可以纠正此错误?非常感谢!

1 个答案:

答案 0 :(得分:2)

这取决于你想要什么。如果你想要内部timeval也是紧凑的,重复结构声明几乎是你唯一的选择:default-packed结构和紧密结构的结构具有相同名称的成员,但是包装的不同使它们成为根本不同的类型。 (FWIW,因为你显然想要节省空间,你可以借此机会使它成为一个位域,并且只分配二十位tv_usec!)

另一方面,如果你不关心时间间隔内的填充 - 只在它与其他结构之间 - 你的另一种选择是将其声明为char tuple_stime[sizeof(timeval)]而不是如有必要。 (不要忘记别名问题。)