[英]lvalue required as increment operand error with old C code
我用gcc-4.7獲取所需的左值作為增量操作數錯誤消息
void func1()
{
u32 *src;
hwrcolor c;
c = *(((u32*)src)++);
}
和
void func2()
{
u8 *dest;
hwrcolor c;
u32 * u32Dest;
*(((u32 *)dest)++) = c;
}
我將它們更改為
void func1()
{
u32 *src;
hwrcolor c;
u32Dest = ((u32*)src);
//c = *(u32Dest ++);
*u32Dest = *u32Dest + 1;
c = *u32Dest;
}
和
void func2()
{
u8 *dest;
hwrcolor c;
u32 * u32Dest;
u32Dest = ((u32 *)dest);
//*(u32Dest++) = c;
*u32Dest = *u32Dest + 1;
*u32Dest = c;
}
可以編譯源代碼,但應用程序無法按預期工作。 轉換是真的嗎?
編碼:
((T *)p)++
是非法的,因為++
只能應用於左值。
這是因為++
的副作用是增加了存儲在變量中的值,但是(T *)p
不是變量。 這是將p
轉換為新類型的臨時結果。
這與int x = 5; (x + 3)++;
int x = 5; (x + 3)++;
。 這沒有道理。
在某些較舊的編譯器中,代碼為((T *)p)++;
被接受並被視為:
(*(T **)&p)++;
換句話說,將存儲位置p
當作實際存儲其他類型的指針一樣對待,然后將該指針遞增。 這對這些編譯器有效,因為這些編譯器僅在所有指針以相同方式存儲的硬件上運行。
您的func1
的解決方法只是編寫c = *src++;
。 不需要強制類型轉換,因為src
已經是正確的類型。
在func2
,代碼*(((u32 *)dest)++) = c;
可以替換為:
*(*(u32 **)&dest)++ = c;
您的版本無效,因為您永遠不會增加原始dest
。 實際上,在您的兩次嘗試中,您都將增加所指向的數據,而原始代碼將使指針增加,而使數據保持不變。
請注意, func2
違反了嚴格的別名規則。 較早的編譯器沒有基於嚴格的別名規則進行優化,但是最新版本的gcc可以進行優化。 編譯此代碼時,應使用標志-fno-strict-aliasing
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.