我正在设计C库,它进行一些数学计算。我需要指定序列化接口才能保存然后加载一些数据。问题是,在库的公共API中使用FILE *指针是否正确(从二进制兼容性的角度来看)?
目标平台是:
我需要尽可能多的二进制兼容,所以目前我的变体如下:
void SMModuleSave(SMModule* module, FILE* dest);
SMModule* SMModuleLoad(FILE* src);
所以我很好奇是否使用FILE *或更好地切换到wchar * / char *?
答案 0 :(得分:4)
我不同意ThiefMaster:当有一个等效的便携式解决方案时,使用本机(即在linux上使用类型int
的文件描述符和Windows上类型void *
的句柄)没有任何好处。
我可能会使用FILE *
而不是从库中按名称打开文件:对于库用户来说可能更麻烦,但它也更灵活,因为大多数libc实现提供了各种方法文件打开(fopen()
,_wfopen()
,_fdopen()
,fdopen()
,fmemopen()
,...),您无需维护单独的宽字符API自己。
答案 1 :(得分:2)
我不使用,但让用户将文件描述符作为int
传递。
然后,您可以在代码中fdopen()
获取FILE*
。
然而,当使用Windows时,它可能不是最好的解决方案,即使它确实有一些辅助函数来获取数字文件描述符。
但是,传递FILE*
或const char*
也应该没问题。我更喜欢传递一个文件名,因为如果一个库负责打开/关闭文件,它的代码就少了。
答案 2 :(得分:1)
是的,从稳定的二进制接口角度来看,在这里使用FILE *
是正确的。我想也许你对使用FILE
而不是指向它的指针感到困惑。请注意,您的标准库的fopen
,fgets
等函数都使用FILE *
类型作为参数和返回值作为其公共接口的一部分。
答案 3 :(得分:0)
FILE *
是标准ANSI / ISO C89和C99(甚至K& R)类型。这是一个可携带的梦想,我更喜欢它。你可以安全地使用它。它不会比这更好。