【问题标题】:What are the POSIX like functions in MSVC's C runtime?MSVC 的 C 运行时中有哪些类似 POSIX 的函数?
【发布时间】:2014-06-22 01:35:12
【问题描述】:

今天我偶然发现了 MSDN 的有关 Visual C++ 的 C 运行时的文档(例如:http://msdn.microsoft.com/en-us/library/8syseb29.aspx),令我惊讶的是,许多函数看起来就像 POSIX 系统调用:dup2fdopenstat、@ 987654326@, ...,除了前缀为__w。这些函数只是 Windows API 的包装器吗?它们仅可用于 POSIX 子系统吗?它们是否已被弃用/将被弃用?

【问题讨论】:

  • Windows 曾经支持 3 个 api 层。 Win32、OS/2 和 Posix。 Win32 以压倒性优势获胜。 posix 函数仍然受支持,但由于它们不是 OS 或标准 C 函数,因此得到了前导下划线。您可以在 win32 程序中使用它们,它会尽力使其正常运行。不要指望奇迹,像 _stat() 这样的函数当然不会告诉你任何关于 inode 的信息。而且没有_fork(),那太陌生了。
  • 这里有一个“已弃用”的 POSIX 函数列表:msdn.microsoft.com/en-us/library/ms235384.aspx(已弃用,因为它们会作为非标准 CRT/C++ 标准库函数引起弃用警告,而不是因为它们可能很快就会消失。)一些 POSIX 函数已成为 C99 或 ISO C++ 标准,并且未被弃用。
  • @ColinRobertson:但_stat 没有(或者是吗?)弃用,其语法与stat 相同。我不关心 POSIX 一致性,我只是觉得类似 POSIX 的 api 更容易使用。

标签: c visual-studio winapi visual-c++


【解决方案1】:

这些函数是围绕 Win32 API 的包装器。您无需拥有 POSIX 子系统即可使用它们。它们不太可能消失 - Microsoft 非常重视向后兼容性。

您可以在“\Program Files (x86)\Microsoft Visual Studio X.0\VC\crt\src”中找到 MS CRT 的源代码。例如。你可以看到_dup2 正在调用DuplicateHandle_stat 正在使用FindFirstFileEx

至于为什么他们得到下划线,我找不到官方原因,但我怀疑这可能是因为这些函数不完全符合 POSIX 标准。

【讨论】:

  • §17.6.4.3.2b "每个以下划线开头的名称都保留给实现用作全局命名空间中的名称。"。我猜这就是它背后的基本原理。
【解决方案2】:

重要的是要知道一些非下划线函数是 C 标准的一部分(例如,fwrite 在 C11 的第 7.21.8.2 节中指定),而其他的则是指定的在 POSIX 标准中,并且不是 C 标准的一部分(例如strdup)。

现在 Windows 不是 100% 兼容 POSIX,因此这些 POSIX-like 函数可能会也可能不会根据 POSIX 规范运行。某些依赖于这些函数的 POSIX 行为的 C 应用程序很可能会在 Windows 上编译但无法运行,或者运行但无法正常工作。

为了防止这种情况发生,MSVC 会在您每次尝试使用它们时向您发出警告:

警告 C4996:“strdup”:不推荐使用此项目的 POSIX 名称。 而是使用符合 ISO C++ 标准的名称:_strdup。请参阅在线帮助以获取 详情。

现在,虽然这听起来_strdup 是由 ISO 标准化的,但它不是;它只是“每个以下划线开头的名称都保留给实现”,[lib.global.names]/2

Microsoft 基本上为您提供另一个名称_strdup,它不附带 POSIX 包袱。不过,您可能在任何其他平台上都找不到它。

最后,只有一个实现,_strdup,链接器只是将strdup 映射到_strdup(参见oldnames.lib)。

【讨论】:

    猜你喜欢
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-16
    • 2016-08-24
    • 2010-09-18
    • 1970-01-01
    • 2012-12-23
    相关资源
    最近更新 更多