首页 > 后端开发 > C++ > 如何恢复 Windows 中缺失的'unistd.h”功能以进行跨平台 C 开发?

如何恢复 Windows 中缺失的'unistd.h”功能以进行跨平台 C 开发?

DDD
发布: 2024-12-06 05:58:12
原创
452 人浏览过

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
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板