最近在工作過程中遇到了一個編譯問題,提示功能函數沒有聲明,但是檢查了多次,確認這些功能函數都聲明過了。
我開始使用排除法,首先編譯順序,在Makefile中編譯順序沒有問題,排除;
之後檢查頭文件中函數的聲明,沒問題,排除;
再來是頭文件的包含,也沒問題,排除;
接下來檢查頭文件順序,也沒問題,排除;
這時候我迷茫了,爲什麼呢?
在我一籌莫展的時候,我突然發現了一個懷疑點,有兩個頭文件的#ifndef是一樣的!!!
然後一切都明朗了,原因找到了,就是因爲在不同的頭文件中使用了相同的#ifndef,並且聲明函數的頭文件在第二順位引用導致的。
在頭文件中#ifndef的作用就是防止重複引用的。
這個錯誤是一個比較低級的錯誤,原因是公司有特定的編碼規範,頭文件有一定的格式,當時犯懶就複製了一份來寫新的頭文件,忘記了修改#ifndef,導致這麼個錯誤。
這是個教訓,同時也深化了對於#ifndef的重視,引以爲戒,大家共勉。