最近一个项目中用到了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 |