したがって、次のように定義された共用体があります。
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 * を使用したり、関数ごとに異なるポインタ型を使用したりしないようにしていますが、それにフォールバックする必要がある場合があります。
役立つ情報をもう 1 つ。コードは C ですが、ライブラリを使用するコードは C++ です。
これを許可しない C++ について何か特別なことはありますか?