簡體   English   中英

AVR 編譯器的 IAR - 在沒有警告的情況下將 unsigned short 轉換為 unsigned char

[英]IAR for AVR compiler - converting unsigned short to unsigned char without warning

今天我發現我的代碼出現了一個非常不熟悉的情況。 我已經更改了作為參數傳遞給函數的變量類型 - 從 unsigned char 到 unsigned short 並且......沒有警告。 在調試中我看到變量的值被截斷了,其余的函數愉快地使用一半的值沒有任何問題......?到底是什么?!

下面是簡短的代碼片段:

void func1(unsigned char param)
{
    if(param == 0x02) //even if passed parameter is 0x0102, truncated data fits and enter branch
    {
        __asm("nop"); //just anything to avoid optimization
    }  
}

void func2(void)
{
    unsigned short param_test = 0x0102;
    unsigned char test2;

    test2 = param_test; //completely fine for compiler, "test2" stores 0x02 value
    (void)test2;        //to avoid compiler warning of not used variable

    func1(param_test);
}

IAR 編譯器沒有發現不通知程序員某些事情可能無法按預期工作的任何問題......

Windows C 編譯器是 VS 至少返回警告 C4244:“從 unsigned short 轉換為 unsigned char,可能丟失數據”。 IAR 也有標志嗎? 我還沒有找到它...

來自ISO/IEC 9899:1999 C 語言規范的附錄 I:

一個實現可能會在許多情況下產生警告,這些警告都沒有被指定為本國際標准的一部分。 以下是一些比較常見的情況。 [...]

  • 遇到隱式縮小轉換,例如將long intdouble賦值給int ,或將指向void的指針賦值給指向字符類型以外的任何類型的指針 (6.3)。

[...]

這意味着,根據標准, char類型不“通常”有權發出警告。

基於這個特定問題,一種可能的解決方案是將參數作為指針傳遞到func1()函數中:

#include <stdbool.h>

bool func1(unsigned char *param);
bool func1(unsigned char *param)
{
    return (*param == 0x02);
}

在這種情況下,編譯器在嘗試將指針傳遞給short時會產生編譯時錯誤:

func1(&param_test); 

將失敗並顯示Error[Pe167]: argument of type "unsigned short *" is incompatible with parameter of "unsigned char *"

通常,這種做法有助於在編譯時捕獲錯誤,並具有節省一些周期的潛在良好副作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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