MSVC的C运行时中的POSIX函数是什么?

时间:2014-05-05 16:50:04

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

今天我偶然发现了MSDN关于Visual C ++ C运行时的文档(例如:http://msdn.microsoft.com/en-us/library/8syseb29.aspx)并且让我惊讶的是很多看起来像POSIX系统调用的函数: dup2fdopenstatexeclp,...,除了以__w作为前缀。这些函数只是Windows API的包装器吗?它们只适用于POSIX子系统吗?他们被弃用/将被弃用吗?

2 个答案:

答案 0 :(得分:5)

这些函数是Win32 API的包装器。您不需要让POSIX子系统使用它们。它们不太可能消失 - 微软非常重视兼容性。

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

至于为什么他们得到了下划线,我找不到官方的理由,但我怀疑这可能是因为这些功能无法提供完整的POSIX合规性。

答案 1 :(得分:1)

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

现在Windows不是100%POSIX兼容的,因此这些类似POSIX的功能可能会或可能不会根据POSIX规范运行。依赖于这些函数的POSIX行为的某些C应用程序很可能可以编译但不能在Windows上运行或运行但是工作不正确。

为了防止出现这种情况,每当您尝试使用时,MSVC都会向您发出警告:

  

警告C4996:'strdup':不推荐使用此项目的POSIX名称。   而是使用符合ISO C ++的名称:_strdup。请参阅在线帮助   的信息。

现在,尽管像_strdup这样的声音是由ISO标准化的,但不是;它只是weaselease for“每个以下划线开头的名称都保留给实现”,[lib.global.names]/2

Microsoft基本上为您提供另一个名称_strdup,该附件不附带POSIX行李。但是,您可能无法在任何其他平台上找到它。

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