[英]What are the POSIX like functions in MSVC's C runtime?
今天我偶然发现了MSDN关于Visual C ++的C运行时的文档(例如: http : //msdn.microsoft.com/en-us/library/8syseb29.aspx ),让我惊讶的是很多看起来像POSIX系统调用的函数: dup2
, fdopen
, stat
, execlp
,...,除了以_
或_w
为前缀。 这些函数只是Windows API的包装器吗? 它们只适用于POSIX子系统吗? 他们被弃用/将被弃用吗?
这些函数是Win32 API的包装器。 您不需要让POSIX子系统使用它们。 它们不太可能消失 - 微软非常重视兼容性。
您可以在“\\ Program Files(x86)\\ Microsoft Visual Studio X.0 \\ VC \\ crt \\ src”中找到MS CRT的源代码。 例如,您可以看到_dup2
正在调用DuplicateHandle
而_stat
正在使用FindFirstFileEx
。
至于为什么他们得到了下划线,我找不到官方的理由,但我怀疑这可能是因为这些功能不能提供完整的POSIX合规性。
重要的是要知道一些非强制函数是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“ 以下划线开头的每个名称都保留给实现 ”, [lib.global.names] / 2 。
微软基本上会为您提供另一个名称 _strdup
,该名称不附带POSIX行李。 但是,您可能无法在任何其他平台上找到它。
最后,只有一个实现, _strdup
,链接器只是将strdup
映射到_strdup
(参见oldnames.lib )。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.