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 * を使用したり、関数ごとに異なるポインタ型を使用したりしないようにしていますが、それにフォールバックする必要がある場合があります。

役立つ情報をもう 1 つ。コードは 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 に答える
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 Copyright (C) 2011 Free Software Foundation, Inc. これはフリー ソフトウェアです。条件のコピーについてはソースを参照してください。保証はありません。商品性や特定の目的への適合性のためでさえありません。

の実装かもしれませんがwrite_long_long_to_buffer、 long_long 関数に char ポインタを渡すのはなぜですか?

GCC のバージョンとコンパイル フラグは何ですか?

于 2013-06-12T18:27:50.773 に答える