所以我定義了諸如工會: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++,不允許這?
gcc版本4.4.7,唯一的編譯標誌在這一點上是錯誤的。我有一個緩衝區,需要填入各種大小的數據。這個緩衝區有時可能是不同的大小(不是8字節的倍數),因此使用了uint8_t buf [xxx]。長久的寫作也只是一個例子。其他人也將被使用。現在我的調用只是在一些單元測試中,我還沒有完成應用程序的其餘部分。 – Matt
剛剛嘗試過你,它確實編譯並運行find。 – Matt
顯然它是C++的東西,因爲g ++也不喜歡你的。該代碼是我正在處理的庫的一部分。該庫是用C語言編寫的,但我也在編寫的單元測試使用的是C++框架(因此使用g ++) – Matt