我正在为LCD显示器使用一些嵌入式C代码,其中一个文件包括stdio.h,并定义fputcfgetcferror.fputc调用LCD驱动程序代码将字符打印到屏幕上,但其他两个实际上并不做任何有趣的事情.

每当我try 编译该项目时,我都会收到以下错误:

SRC/ST7735.c:1578:5:错误:应为标识符或‘int’前的‘(’ 1578|int Ferror(文件*f){

SRC/ST7735.c:1578:5:错误:应为‘)’在‘(’标记1578|INT之前 错误(文件*f){

如果我将ferror重命名为其他名称,错误就会消失.另外两个函数不会产生任何问题.我还发现,如果我确实重命名了函数,但在代码中的其他地方调用了ferror,项目仍然可以编译,而我预计在没有为项目中其他任何地方定义ferror的情况下,链接会失败.

我使用的是带有-nostdlib标志的arm-none-eabi工具链,但该项目最初是使用Keil创建的.我不确定这是否是部分原因.我在谷歌上搜索了所有相关信息,但什么也找不到.《GCC》中的ferror有什么特别之处吗?

推荐答案

…其中一个文件包括stdio.h并定义fputcfgetcferror.

这看起来像是在try 实现那些标准库函数,就像C实现必须为其用户实现那些函数一样.

标准库函数的实现者负责提供头<stdio.h>和函数的实现,并确保它们一起工作.包括别人的<stdio.h>,并写下你自己的定义,通常不是一个好的方法.通常,其他人的<stdio.h>实现包含不适合您的实现的定制.通常,最好从编写您自己的<stdio.h>开始,简单地声明C标准中描述的函数.

如果做不到这一点,可能不需要在定义fputcfgetcferror的源文件中包含<stdio.h>.只需删除标题并定义函数即可.

如果您不希望这样做,那么在#include <stdio.h>之后添加#undef ferror可能会解决您当前遇到的问题.但是,它可能不能解决整个问题,因为如果使用您的 routine 的源文件包含相同的<stdio.h>,则它们将获得<stdio.h>中定义的ferror宏,而不会调用您定义的ferror routine .要解决这个问题,您需要提供一个不同的<stdio.h>.

C++相关问答推荐

VS代码C/C++扩展intellisense无法检测环境特定函数'

在C中使用JMP_buf数组进行线程化(在xv6中测试)

使用AVX2的英特尔2022编译器的NaN问题&;/fp:FAST

进程已完成,退出代码为138 Clion

将 struct 传递给函数

为什么数组的最后一个元素丢失了?

处理来自浏览器的HTTP请求

为什么这个分配做得不好呢?

我应该在递归中使用全局变量吗

条件跳转或移动取决于未初始化值(S)/未初始化值由堆分配创建(Realloc)

我不知道为什么它不能正常工作,我用了get()和fget(),结果是一样的

某些EAX值的不同调用方的CPUID结果不一致

从整型转换为浮点型可能会改变其值.

C中的空指针是什么(_N)?

x86-64平台上的int_fast8_t大小与int_fast16_t大小

If语句默认为true

为什么实现文件中的自由函数默认没有内部链接?

比 * 更快的乘法

我们可以在不违反标准的情况下向标准函数声明添加属性吗?

获取指向 struct 的指针而不显式传递它