FILE *的二进制兼容性

时间:2011-04-11 12:18:46

标签: c api binary-compatibility

我正在设计C库,它进行一些数学计算。我需要指定序列化接口才能保存然后加载一些数据。问题是,在库的公共API中使用FILE *指针是否正确(从二进制兼容性的角度来看)?

目标平台是:

  • Linux x86,x86_64,gcc> = 3.4.6
  • Windows x86,x86_64> = WinXP,VS> = 2008sp1

我需要尽可能多的二进制兼容,所以目前我的变体如下:

void SMModuleSave(SMModule* module, FILE* dest);
SMModule* SMModuleLoad(FILE* src);

所以我很好奇是否使用FILE *或更好地切换到wchar * / char *?

4 个答案:

答案 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而不是指向它的指针感到困惑。请注意,您的标准库的fopenfgets等函数都使用FILE *类型作为参数和返回值作为其公共接口的一部分。

答案 3 :(得分:0)

FILE *是标准ANSI / ISO C89和C99(甚至K& R)类型。这是一个可携带的梦想,我更喜欢它。你可以安全地使用它。它不会比这更好。