簡體   English   中英

左值需要作為舊C代碼的增量操作數錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM