簡體   English   中英

GCC如何解釋ferror定義?

[英]How does GCC interpret ferror definition?

我正在使用一些用於 LCD 顯示器的嵌入式 C 代碼,其中一個文件包含stdio.h並定義了fputcfgetcferror 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並定義了fputcfgetcferror

這似乎是您正在嘗試實現這些標准庫函數,因為 C 實現必須為其用戶實現這些函數。

標准庫函數的實現者負責提供 header、 <stdio.h>和函數的實現,並確保它們協同工作。 包含其他人的<stdio.h>並編寫您自己的定義通常不是解決此問題的好方法。 通常,其他人的<stdio.h>實現包含不適合您的實現的定制。 通常最好從編寫您自己的<stdio.h>開始,它簡單地聲明 C 標准中描述的函數。

如果做不到這一點,可能不需要在您定義fputcfgetcferror的源文件中包含<stdio.h> 只需刪除 header 並定義函數即可。

如果您不想這樣做,那么在#include <stdio.h>之后添加#undef ferror可能會解決您遇到的直接問題。 但是,它可能無法解決整個問題,因為如果使用您的例程的源文件包含相同的<stdio.h> ,它們將獲得<stdio.h>中定義的ferror宏,並且不會調用您的ferror例程定義。 要解決這個問題,您需要提供一個不同的<stdio.h>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM