首頁 > 後端開發 > C++ > 如何恢復 Windows 中缺少的「unistd.h」功能以進行跨平台 C 開發?

如何恢復 Windows 中缺少的「unistd.h」功能以進行跨平台 C 開發?

DDD
發布: 2024-12-06 05:58:12
原創
451 人瀏覽過

How Can I Recover the Missing `unistd.h` Functionality in Windows for Cross-Platform C   Development?

為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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板