2013-06-12 44 views
0

所以我定義了諸如工會:GCC透明工會

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++,不允許這?

回答

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; 
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自由軟件基金會,公司 這是自由軟件;請參閱複製條件的來源。有沒有 保修;甚至不適用於適銷性或針對特定用途的適用性。

也許這是你的實現write_long_long_to_buffer,爲什麼你傳遞一個字符指針到long_long函數?

什麼是您的GCC版本和編譯標誌?

+0

gcc版本4.4.7,唯一的編譯標誌在這一點上是錯誤的。我有一個緩衝區,需要填入各種大小的數據。這個緩衝區有時可能是不同的大小(不是8字節的倍數),因此使用了uint8_t buf [xxx]。長久的寫作也只是一個例子。其他人也將被使用。現在我的調用只是在一些單元測試中,我還沒有完成應用程序的其餘部分。 – Matt

+0

剛剛嘗試過你,它確實編譯並運行find。 – Matt

+0

顯然它是C++的東西,因爲g ++也不喜歡你的。該代碼是我正在處理的庫的一部分。該庫是用C語言編寫的,但我也在編寫的單元測試使用的是C++框架(因此使用g ++) – Matt

1

顯然g ++並不真正關心__transparent_union__屬性。它工作正常,如果編譯直C應用程序,但使用g ++時有問題

+0

基本上,您應該假定C++不支持GNU C擴展(除非它們實際上是C++)。 –