我有以下導致-Wincompatible-pointer-types警告的代碼:
union SensorData
{
uint64_t raw_sensor_data;
struct
{
uint16_t humidity_data;
uint16_t temperature_data;
};
} sensor_data;
/* ... Bunch of other code ...*/
uint8_t *raw_sensor_data_bytes = &sensor_data.raw_sensor_data;
uint8_t checksum = raw_sensor_data_bytes[0];
uint8_t sum = 0;
for (uint8_t i = 1; i < 8; i )
{
sum = raw_sensor_data_bytes[i];
}
這是由此產生的錯誤:
warning: initialization of 'uint8_t *' {aka 'unsigned char *'} from incompatible pointer type 'uint64_t *' {aka 'long long unsigned int *'} [-Wincompatible-pointer-types]
88 | uint8_t *raw_sensor_data_bytes = &sensor_data.raw_sensor_data;
| ^
我想我理解為什么會觸發錯誤:這是因為我有一個指標指向一個 8 位整數,而實際上它指向的是一個 64 位整數;但是,這是(我目前認為的)一個很好的理由。我需要將該 64 位整數拆分為 8 位段,因此我認為創建一個實際上將 64 位整數分成 8 個 8 位段的指標會很好;但是,這樣做會導致上述警告。有沒有更合適的方法來做我想做的事情來消除警告,或者我是否可以簡單地以某種方式覆寫警告,或者我只需要忽略它?
uj5u.com熱心網友回復:
將物件指標轉換為指向char或unsigned char(或等效)的指標以訪問物件的各個位元組是明確定義的,只要轉換是通過顯式強制轉換發生的:
uint8_t *raw_sensor_data_bytes = (uint8_t *)&sensor_data.raw_sensor_data;
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/470616.html
下一篇:C-對動態大小的字串陣列進行排序
