繁体   English   中英

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

[英]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系统调用的函数: dup2fdopenstatexeclp ,...,除了以__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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM