declaration is incompatible ,定義不兼容的意思
最基本的錯誤就是定義和聲明的時候在參數裏出現了數據格式,參數數量或形參名字的不一致導致的
但是很多情況下不是這個問題導致的,而是一些其他的問題間接觸發的:
- (1)使用未定義函數(一般是聲明順序問題)
對於這種問題,可以把B函數放到A函數之前,也可以採用先聲明後定義的辦法解決,把所有的聲明都放在頭文件中,可以方便調試的時候理清邏輯。
- (2)筆者遇到的問題,來自一個隱祕的定義衝突
問題描述:
編譯時報錯:
..\HARDWARE\Framework\framework.c(32): error: #147-D: declaration is incompatible with "void text_erase(u16, u16, u8)" (declared at line 19 of "..\HARDWARE\Framework\framework.h")
但實際定義完全一樣(如圖)。
經過排查,發現問題來自於我在串口屏驅動中添加的幾個宏定義:
u8,u16,u32這些數據類型已經在stm32的自帶庫“sys.h”包含,而且此宏定義和“sys.h”聲明中數據類型不一致,因而觸發此問題。
解決辦法:註釋掉這三句宏定義,直接使用 #include “sys.h” 即可。