GCC透明联盟

时间:2013-06-12 17:57:27

标签: c gcc compiler-errors unions

所以我的联盟定义如下:

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 ++有什么特别之处吗?

3 个答案:

答案 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版本和编译标志是什么?