为 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中文网其他相关文章!