gpt4 book ai didi

c++ - 关于 __attribute__((__packed__)) 的 c++ 编译错误还有哪些其他方法?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:09:55 27 4
gpt4 key购买 nike

当我编译以下代码时:

#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之后我自己如下并改变了所有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 )] 代替,并根据需要进行转换。 (不要忘记别名问题。)

关于c++ - 关于 __attribute__((__packed__)) 的 c++ 编译错误还有哪些其他方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25669751/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com