2014-09-04 144 views
4

当我编译下面的代码:有关__attribute __((__ packed__))的C++编译错误的其他方法是什么?

#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__)); 

e rror消失了,但我不想定义一个已经存在于<bits/time.h>中的结构。有什么其他方法可以纠正这个错误?非常感谢!

+0

编写不依赖于结构填充(或缺少它)的代码。 – 2014-09-05 00:25:42

回答

2

这取决于你想要什么。如果你想让内部时间值紧密包装,重复结构声明几乎是你唯一的选择:默认包装结构和紧凑包装结构具有相同名称的成员,但是包装的差异使得它们根本不同的类型。 (FWIW,因为无论如何你都明显想要节省空间,所以你可以借此机会让它成为一个位域,并且只分配20位!)

另一方面,如果你不关心在timeval内有填充 - 只能在其与其他结构之间填充 - 另一种选择是将其声明为char tuple_stime[sizeof(timeval)],并根据需要进行强制转换。 (别忘了别名问题。)

+4

和对齐问题。 – 2014-09-04 23:11:20

+0

像Sneftel提到的那样,packed属性影响基本类型,更详细的描述[here。](https://gcc.gnu.org/bugzilla/show_bug.cgi?id=36566) – squater 2014-10-21 08:50:46

相关问题