打印

FatFS中函数名与标准库stdio.h中函数名冲突,向高手求助

[复制链接]
5617|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hotyong|  楼主 | 2012-5-21 11:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近一个项目中用到了FatFS,并且由于项目功能的问题,想使用fprintf 函数直接将数据存储到SD卡中,但是在FatFS中这个函数名竟和
stdio.h中的函数一样,而且显然它们的参数是不一样的,主要是FIL与FILE, 导致编译通不过,我想知道这算不算是FatFS的bug? 如果不是的
话那怎样能避开这个问题,使得程序能够正确调用FatFS中的这组函数。
报错如下:
..\..\FatFs\tff.h(184): error:  #147-D: declaration is incompatible with "int fputc(int, FILE *)" (declared at line 605 of
"C:\Keil\ARM\RV31\INC\stdio.h")
..\..\FatFs\tff.h(186): error:  #147-D: declaration is incompatible with "int fprintf(FILE *restrict, const char *restrict,

...)" (declared at line 330 of "C:\Keil\ARM\RV31\INC\stdio.h")

在FatFS中有这样的定义,默认请况下_USE_STRFUNC=0,但由于我要使用这个函数,所以将其赋值为1
#if _USE_STRFUNC
#define feof(fp) ((fp)->fptr == (fp)->fsize)
#define EOF -1
int fputc (int, FIL*);        /* Put a character to the file */
int fputs (const char*, FIL*);      /* Put a string to the file */
int fprintf (FIL*, const char*, ...);    /* Put a formatted string to the file */
char* fgets (char*, int, FIL*);      /* Get a string from the file */
#endif

在stdio.h中有同样一套函数
_CRTIMP int __cdecl fgetc (FILE*);
_CRTIMP char* __cdecl fgets (char*, int, FILE*);
_CRTIMP int __cdecl fputc (int, FILE*);
_CRTIMP int __cdecl fputs (const char*, FILE*);
_CRTIMP int __cdecl fprintf (FILE*, const char*, ...);


我现在的做法是将其改为与stdio.h中不同的函数名,当然c文件也同样改了,但是这样的话肯定是破坏了FatFS的完整性的。而且如果只是改名
称也就罢了,因为fprintf fputs会调用fputc等函数,所以在函数内部都要将其调用的函数名称全部改掉。

#if _USE_STRFUNC
#define f_eof(fp) ((fp)->fptr == (fp)->fsize)
#define EOF -1
int f_putc (int, FIL*);        /* Put a character to the file */
int f_puts (const char*, FIL*);      /* Put a string to the file */
int f_printf (FIL*, const char*, ...);    /* Put a formatted string to the file */
char* f_gets (char*, int, FIL*);      /* Get a string from the file */
#endif

相关帖子

沙发
airwill| | 2012-5-21 12:36 | 只看该作者
fprintf 本来是听一个函数, 然而 FatFS 文件系统 改变了 FILE 结构, 于是重新定义了 FIL*, 和 stdio.h中的 FILE* 有区别.
从应用的角度, 楼主的办法也算个不错的办法.

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
hotyong + 1
板凳
原野之狼| | 2012-5-21 12:42 | 只看该作者
如果你用C++ 就不用为这样的问题费神了 因为可以定义namespace

使用特权

评论回复
地板
hotyong|  楼主 | 2012-5-21 12:56 | 只看该作者
3# 原野之狼
FatFS不支持C++吧,
如果说我让他支持C++,还是要动FatFS的代码,这与我现在的解决方案可能也区别不大,再说我还不太懂单片机怎样实现C++呢,
我主要想知道这是不是个bug,如果是的话,那就是必须要动FatFS的代码了。

使用特权

评论回复
5
原野之狼| | 2012-5-21 13:43 | 只看该作者
只要你的编译器支持就行,c++是兼容c的。  然后namespace{}就行了,当然你这里不用去玩这个。

bug算不上。
c代码里的接口函数前面都会搞个前缀(比如fatfs的f_前缀),目的就是防止名字冲突 。
而你用到的fprintf是一个标准命名,冲突难免!fatfs不在其前面加个前缀,完全是为了方便起见。

你的解决方案可以的,改动很小,仅仅是个名字,逻辑上丝毫不影响的。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
hotyong + 1
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

652

帖子

2

粉丝