[英]How does GCC interpret ferror definition?
我正在使用一些用於 LCD 顯示器的嵌入式 C 代碼,其中一個文件包含stdio.h
並定義了fputc
、 fgetc
和ferror
。 fputc
調用 LCD 驅動程序代碼將一個字符打印到屏幕上,但其他兩個實際上並沒有做任何有趣的事情。
每當我嘗試編譯項目時,我都會收到以下錯誤:
src/ST7735.c:1578:5: 錯誤:預期標識符或 '(' 在 'int' 1578 | int ferror(FILE *f){
src/ST7735.c:1578:5: 錯誤:'(' 令牌 1578 之前應為 ')' | int ferror(FILE *f){
如果我將ferror
重命名為其他名稱,錯誤就會消失。 其他兩個功能不會產生任何問題。 我還發現,如果我重命名 function 但在代碼的其他地方調用ferror
,項目仍然編譯,當我預計鏈接會失敗,而項目中其他任何地方都沒有ferror
的定義。
我正在使用帶有-nostdlib
標志的arm-none-eabi工具鏈,但該項目最初是使用Keil創建的。 我不確定這是否是解釋的一部分。 我在谷歌上搜索了任何相關信息,但沒有找到任何信息。 GCC中的ferror
有什么特別之處嗎?
…其中一個文件包括
stdio.h
並定義了fputc
、fgetc
和ferror
。
這似乎是您正在嘗試實現這些標准庫函數,因為 C 實現必須為其用戶實現這些函數。
標准庫函數的實現者負責提供 header、 <stdio.h>
和函數的實現,並確保它們協同工作。 包含其他人的<stdio.h>
並編寫您自己的定義通常不是解決此問題的好方法。 通常,其他人的<stdio.h>
實現包含不適合您的實現的定制。 通常最好從編寫您自己的<stdio.h>
開始,它簡單地聲明 C 標准中描述的函數。
如果做不到這一點,可能不需要在您定義fputc
、 fgetc
和ferror
的源文件中包含<stdio.h>
。 只需刪除 header 並定義函數即可。
如果您不想這樣做,那么在#include <stdio.h>
之后添加#undef ferror
可能會解決您遇到的直接問題。 但是,它可能無法解決整個問題,因為如果使用您的例程的源文件包含相同的<stdio.h>
,它們將獲得<stdio.h>
中定義的ferror
宏,並且不會調用您的ferror
例程定義。 要解決這個問題,您需要提供一個不同的<stdio.h>
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.