天天看點

函數名作參數的意義

最近在ARM上調試時犯了一個低級文法錯誤,錯把函數名當作函數傳回值了,代碼如下:

if(ObsAvdSignalReceived)
        printf("有障礙\r\n");
 else
        printf("無障礙­\r\n");
           

代碼中ObsAvdSignalReceived()是一個函數,傳回值為bool類型,表示是否接收到避障信号。 按上述寫法發現不管是否接收到信号,總是輸出“有障礙”

問題就在于把函數名作為if()語句的條件,函數名代表的是函數位址,用十六進制形式列印:

printf("ObsAvdSignalReceived的位址:%x\r\n",ObsAvdSignalReceived);
           

序列槽輸出如下:

函數名作參數的意義

位址為:0x8002e79

這是一個正值,很明顯條件恒成立,是以出現上述錯誤。 另外,編譯時會有如下警告: warning:specified type 'unsigned int' but the argument has type 'uint8_t (*) (void)' 可以看到ObsAvdSignalReceived的類型是傳回值為uint8_t,參數為void的函數指針,進一步印證了其實質為函數指針。

結論:寫代碼時用到函數傳回值 切記在函數名末尾加上(),表明是傳回值。