最近在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的函數指針,進一步印證了其實質為函數指針。
結論:寫代碼時用到函數傳回值 切記在函數名末尾加上(),表明是傳回值。