**【C語言進階】很詭異的編譯報錯expected declaration or statement at end of input **
一個很詭異的編譯報錯,不仔細還真發現不了!
1 問題現場
有一天我在調試代碼的時候,剛剛代碼還好好的,突然來了一個報錯:
recan@ubuntu:~/11111$ gcc -o test 111/222/333/444/555/666/777/888/999/test.c
111/222/333/444/555/666/777/888/999/test.c: In function ‘test3’:
111/222/333/444/555/666/777/888/999/test.c:37:1: error: expected declaration or statement at end of input
37 | }
| ^
這就讓我很納悶,咋回事呢?
2 復現代碼
我們來看下當時的代碼,為了說明問題,我把無關代碼都刪除了,僅保留有效代碼:
?
#include
?
int test1(void)
{
return 0;
}
?
int test2(void)
{
return 0;
}
?
?
int test3(void)
{
return 0;
?
?
int test4(void)
{
return 0;
}
?
?
int test5(void)
{
return 0;
}
?
?
int main(void)
{
printf("__FILE__: %s\\n", __FILE__);
return 0;
}
?
示例代碼很簡單,就是一堆的函數,然后啥也沒干。
3 編譯分析
**根據編譯報錯,我們看下,提示 **line37行 報錯了? 37行不是文件的結束嗎?
**報錯的英文對應的中文含義是:**錯誤:輸入末尾應為聲明或語句
很顯然不是37行有問題嗎?我的main函數肯定沒有問題???
那么有沒有可能是前面的函數有問題???
**原來是 line16 中的test3函數,少了結尾的 **} 大括號,導致了編譯報錯的蔓延。
當然,解決這個編譯問題也很簡單,把test函數的大括號補上即可。
4 小小總結
- 排查編譯問題,不要僅局限于報錯的行號,找找上下文,可能別人的錯誤導致了你的錯誤;
- **誤刪一行 **} 大括號,不經意間就報錯了;
- 代碼管理,一定要用起來;這種情況,實在不行就比對下代碼,很容易就發現問題了。
5 更多分享
[架構師李肯]
架構師李肯 ( 全網同名 ),一個專注于嵌入式IoT領域的架構師。有著近10年的嵌入式一線開發經驗,深耕IoT領域多年,熟知IoT領域的業務發展,深度掌握IoT領域的相關技術棧,包括但不限于主流RTOS內核的實現及其移植、硬件驅動移植開發、網絡通訊協議開發、編譯構建原理及其實現、底層匯編及編譯原理、編譯優化及代碼重構、主流IoT云平臺的對接、嵌入式IoT系統的架構設計等等。擁有多項IoT領域的發明專利,熱衷于技術分享,有多年撰寫技術博客的經驗積累,連續多月獲得RT-Thread官方技術社區原創技術博文優秀獎,榮獲[CSDN博客專家]、[CSDN物聯網領域優質創作者]、[2021年度CSDN&RT-Thread技術社區之星]、[2022年RT-Thread全球技術大會講師]、[RT-Thread官方嵌入式開源社區認證專家]、[RT-Thread 2021年度論壇之星TOP4]、[華為云云享專家(嵌入式物聯網架構設計師)]等榮譽。堅信【知識改變命運,技術改變世界】!
審核編輯:湯梓紅
-
C語言
+關注
關注
180文章
7605瀏覽量
136993 -
編譯
+關注
關注
0文章
659瀏覽量
32890 -
RT-Thread
+關注
關注
31文章
1293瀏覽量
40193
發布評論請先 登錄
相關推薦
評論