所以我有一个定义如下的工会:
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++ 有什么特别的地方不允许这样做吗?