2011-04-11 133 views
3

我正在設計C庫,它進行一些數學計算。我需要指定序列化接口才能保存並加載一些數據。問題是,在庫的公共API中使用FILE *指針是否正確(從二進制兼容的角度)?文件的二進制兼容性*

目標platfoms是:

  • 於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 *?

+0

我終於決定使用文件描述符,因爲能夠從python和matlab腳本中使用這個庫是很重要的。這兩種語言都提供了fd而不是FILE *。所以我決定使用它,儘管fileno不在c標準中。 – prokher 2011-04-20 20:14:37

+0

發生了另一個問題:AFAIK使用文件描述符和FILE *是不正確的,如果它是使用靜態C運行時(使用/ MT,/ MTd) - [msdn-link](http:/ /msdn.microsoft.com/en-us/library/ms235460%28v=vs.80%29.aspx)。我很困惑。我真的不想在API中使用文件名,因爲它只會將使用限制在磁盤上。相反,使用fd或FILE *可以指定任何流,但靜態CRT並非如此。我被卡住了。 ( – prokher 2011-04-23 10:30:21

回答

4

我不同意ThiefMaster:當存在一個等效的便攜式解決方案時,在本地使用(例如,在Linux上使用int類型的文件描述符以及在窗口上使用類型爲void *的句柄)沒有任何好處。

我可能會用FILE *而不是從庫中按名稱打開文件:它可能對圖書館用戶來說更麻煩,但它也更靈活,因爲大多數libc實現提供了各種文件打開方式( fopen(),_wfopen(),_fdopen(),fdopen(),fmemopen(),...),你不必自己維護獨立的寬字符API。

+0

是的,這是爲了避免維護單獨的寬字符版本。謝謝。 – prokher 2011-04-11 15:11:00

2

我既不使用,但讓用戶通過文件描述符作爲int

然後你可以fdopen()它在你的代碼中得到FILE*

但是,使用Windows時,它可能不是最好的解決方案,即使它確實有一些幫助函數來獲取數字文件描述符。


然而,傳遞FILE*const char*要細,太。如果庫需要打開/關閉文件,我寧願傳遞一個文件名,因爲它的代碼少。

+0

)文件描述符和'FILE *'在這個用例中大部分是可以互換的,因爲你總是可以通過'fdopen()'和'fileno()'獲得另一個;但是,其中只有一個是C標準庫,我很好奇爲什麼會選擇不太便攜的解決方案? – Christoph 2011-04-11 13:22:28

+0

通過'FILE *'選擇文件描述符有幾個很好的理由:當你需要能夠從IO錯誤中恢復時,當你想要做非阻塞的IO或者控制你的程序何時會被阻塞,或者當你需要確保當另一個進程/程序繼承一個打開的文件時,在你的緩衝區中沒有任何輸入會丟失,這些似乎都不適用,所以我會使用'FILE *'。 – 2011-04-11 14:28:56

+0

實際上,我終於決定使用文件描述符,因爲能夠在python和matlab腳本中使用這個庫是非常重要的,這兩種語言都提供了fd而不是FILE *。決定使用它,儘管f行事fileno不在c標準。 – prokher 2011-04-13 07:10:59

1

是的,從穩定的二進制接口角度來看,在這裏使用FILE *是正確的。我想你可能會把這個與使用FILE而不是指向它的指針混淆起來。請注意,標準庫的fopen,fgets等函數都使用(作爲參數和返回值)FILE *類型作爲其公共接口的一部分。

0

A FILE *是標準的ANSI/ISO C89和C99(甚至K & R)型。這是一個可移植的夢想,我更喜歡它。你可以安全地使用它。它不會比這更好。