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