0

所以我有一个定义如下的工会:

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 的地方传递。

我试图避免使用 void * 作为缓冲区类型,或为每个函数使用不同的指针类型,但可能不得不回退到这一点。

还有一点有用的信息。代码是 C,但使用库的代码是 C++。

C++ 有什么特别的地方不允许这样做吗?

4

3 回答 3

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;
于 2013-06-12T19:23:51.350 回答
1

显然 g++ 并不真正关心 __transparent_union__ 属性。如果编译一个直接的 C 应用程序,它可以正常工作,但是在使用 g++ 时会出现问题

于 2013-06-12T18:55:46.677 回答
0

伙计,这段代码对我有用:

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

于 2013-06-12T18:27:50.773 回答