為Windows 使用者恢復「unistd.h」遺失的元素
在跨平台編碼的世界中,遇到特定於平台的情況障礙是不可避免的。將程式碼從 Unix 移植到 Windows 的程式設計師面臨的常見挑戰之一是 Visual C 中缺少「unistd.h」。這個問題的解決方案在於要麼替換單一函數,要麼尋求更全面的解決方案。
對於那些尋求全面方法的人來說,社群正在努力創建一個與 Windows 相容的“unistd.h”,它涵蓋了其 Unix 版本的基本功能。以下程式碼片段提供了一個起點,鼓勵使用者根據需求做出貢獻。
#ifndef _UNISTD_H #define _UNISTD_H 1 /* This is intended as a drop-in replacement for unistd.h on Windows. * Please add functionality as needed. * https://stackoverflow.com/a/826027/1202830 */ #include <stdlib.h> #include <io.h> #include <getopt.h> /* getopt at: https://gist.github.com/ashelly/7776712 */ #include <process.h> /* for getpid() and the exec..() family */ #include <direct.h> /* for _getcwd() and _chdir() */ #define srandom srand #define random rand /* Values for the second argument to access. These may be OR'd together. */ #define R_OK 4 /* Test for read permission. */ #define W_OK 2 /* Test for write permission. */ //#define X_OK 1 /* execute permission - unsupported in windows*/ #define F_OK 0 /* Test for existence. */ #define access _access #define dup2 _dup2 #define execve _execve #define ftruncate _chsize #define unlink _unlink #define fileno _fileno #define getcwd _getcwd #define chdir _chdir #define isatty _isatty #define lseek _lseek /* read, write, and close are NOT being #defined here, because while there are file handle specific versions for Windows, they probably don't work for sockets. You need to look at your app and consider whether to call e.g. closesocket(). */ #ifdef _WIN64 #define ssize_t __int64 #else #define ssize_t long #endif #define STDIN_FILENO 0 #define STDOUT_FILENO 1 #define STDERR_FILENO 2 /* should be in some equivalent to <sys/types.h> */ typedef __int8 int8_t; typedef __int16 int16_t; typedef __int32 int32_t; typedef __int64 int64_t; typedef unsigned __int8 uint8_t; typedef unsigned __int16 uint16_t; typedef unsigned __int32 uint32_t; typedef unsigned __int64 uint64_t; #endif /* unistd.h */
但是,那些尋求更有針對性的解決方案的人可以單獨解決缺失的功能。例如,隨機函數可以用“srand”和“rand”替換,“strcmp”用“_stricmp”替換。對於“getopt”,外部函式庫“gist.github.com/ashely/7776712”提供了一個實作。
雖然建立自訂「unistd.h」是可能的,但值得探索是否有人已經完成了更廣泛功能的繁重工作。這種方法充分利用了社區的努力並節省了寶貴的開發時間。
以上是如何恢復 Windows 中缺少的「unistd.h」功能以進行跨平台 C 開發?的詳細內容。更多資訊請關注PHP中文網其他相關文章!