IMNSHO,这是微软的说法“不要将 Unix 软件放在 Windows 机器上”。这个问题有几个令人沮丧的方面:
strcmpi()
不是 POSIX 函数 - 相关函数在中定义<strings.h>
并被调用strcasecmp()
等。
- 即使您明确要求支持 POSIX 功能,Microsoft 认为您可能不会使用 POSIX 名称,但必须在它们前面加上可恶的下划线。
- AFAIK,没有办法覆盖 MSVC 编译器对该问题的看法。
也就是说,GCC 工具链对某些功能有点草率 -mktemp()
等。但是,尽管有警告(这是有道理的),但它确实可以成功编译和链接。
我注意到 MSVC 在其关于snprintf()
等人的引擎盖上也有一只蜜蜂。如果它们的功能符合 C99 标准(以及编译器的其余部分),那么就永远不会有溢出的风险——标准要求空终止,这与 Microsoft 的声明相反。
对于这个问题,我还没有一个很好的解决方案——我不确定有没有。一种可能性是创建一个标头(或一组标头)以将所有实际的 POSIX 名称映射到 Microsoft 对它们的误解。另一个是两个创建一个具有正确 POSIX 名称的琐碎函数库,每个函数都调用该名称的 Microsoft 版本(为您提供大量四行函数 - 声明符行、左大括号、右大括号和调用 POSIX 函数名称的 Microsoft 变体的 return 语句。
有趣的是,同样污染用户名称空间的 Microsoft API 调用并未被弃用或重命名。