所以我的联盟定义如下:
typedef union
{
uint8_t *b1;
uint16_t *b2;
uint32_t *b3;
uint64_t *b4;
} buffer_u __attribute__((__transparent_union__));
定义的函数如下:
int write_byte_to_buffer(buffer_u buf, uint16_t length, uint8_t val);
int write_short_to_buffer(buffer_u buf, uint16_t length, uint16_t val);
int write_int_to_buffer(buffer_u buf, uint16_t length, uint32_t val);
int write_long_long_to_buffer(buffer_u buf, uint16_t length, uint64_t val);
然后我调用它:
uint8_t buffer[1024];
write_long_long_to_buffer(buffer, 1024, some_value);
编译器给出了以下错误:
error: conversion from ‘uint8_t*’ to non-scalar type ‘buffer_u’ requested
为什么我收到此错误?我必须正确阅读 transparent_union 属性上的文档,因为我希望能够在需要buffer_u的地方传递任何union成员类型。
我试图避免对缓冲区类型使用void *,或者为每个函数使用不同的指针类型,但可能必须回退到那个。
另一个有用的信息。代码是C,但使用该库的代码是C ++。
C ++有什么特别之处吗?
答案 0 :(得分:1)
显然g ++并不真正关心__transparent_union__属性。如果编译一个直接的C应用程序,但使用g ++时有问题
,它工作正常答案 1 :(得分:1)
好吧,正如我们所知,G ++不支持__transparent_union__
。
我认为你需要对所有这些进行类型转换,为了更好的实践,使用一个标志来指定联合填充的数据:
struct s_buffer_u
{
enum e_pointer_width { width8, width16, width32, width64 } width;
union
{
uint8_t *b1;
uint16_t *b2;
uint32_t *b3;
uint64_t *b4;
} buffer_u_internal;
}
typedef struct s_buffer_u _buffer_u;
答案 2 :(得分:0)
Mate,这段代码对我有用:
#include <stdint.h>
typedef union
{
uint8_t *b1;
uint16_t *b2;
uint32_t *b3;
uint64_t *b4;
} buffer_u __attribute__((__transparent_union__));
int write_byte_to_buffer(buffer_u buf, uint16_t length, uint8_t val) {return 0;}
int write_short_to_buffer(buffer_u buf, uint16_t length, uint16_t val) {return 0;}
int write_int_to_buffer(buffer_u buf, uint16_t length, uint32_t val) {return 0;}
int write_long_long_to_buffer(buffer_u buf, uint16_t length, uint64_t val) {return 0;}
int main (int argc, char *argv[])
{
uint8_t p[100];
write_byte_to_buffer(p, 1, 100);
return 0;
}
Gcc版本: fanl @ ubuntu-StiDesktop:〜$ gcc --version gcc(Ubuntu / Linaro 4.6.3-1ubuntu5)4.6.3 版权所有(C)2011 Free Software Foundation,Inc。 这是免费软件;查看复制条件的来源。没有 保证;甚至不适用于适销性或特定用途的适用性。
也许是write_long_long_to_buffer
的实现,为什么要将char指针传递给long_long函数?
你的GCC版本和编译标志是什么?