2019年10月22日 星期二

Use 64 bit offset in fseek function

fseek 的 offset 在 C Spec 中是 32 bit 的長度,由於現在的硬碟都很大,加上 GPT 有關 LBA 的欄位都是 8 個 Byte,當存取較後面的 Sector 時,勢必無法使用 fseek 這類的標準 C 函式庫,故我在撰寫 WinGPT 時,一開始使用的是 Win32 API。

後來查了一下資料,GCC 類的 compiler 有一個 fseeko 的函數可用,其宣告是在 stdio.h 裡,在 Windows 下不論是使用 TDM-GCC or MinGW 都可以直接使用,但在 Ubuntu 下,我們需定義一個 macro _LARGEFILE_SOURCE,記得要在 include 其他 header 時先定義。

https://github.com/tylpk1216/WinGPT/blob/master/WinGPT.c

另外在查資料時,發現到 2 件事:

1. printf%ll 在 TDM-GCC or MinGW 編譯時,如果有設 -Wall,會有 "warning: unknown conversion type character 'l' in format" 之類的錯誤訊息,那是因為這些 compiler 底層呼叫的仍是 Windows Runtime( msvcrt-DLL ),由於它不相容 C99 標準,故會有此 warning。

解決方式: 使用 %I64

2. 可以使用 "__linux__" 區分是 Ubuntu or Windows 環境,不需使用 -D 選項就可以寫出漂亮的 code。

沒有留言:

張貼留言