Win32 mkdir vs _mkdir

时间:2015-10-25 06:02:55

标签: c++ winapi posix

this page上,Microsoft声明不推荐使用POSIX mkdir,而是赞成“ISO C ++ Conformant”_mkdir。这似乎适用于其他类似的POSIX函数。

他们是否意味着在他们担心的情况下被弃用,或者是否有一些标准组织(POSIX,ISO?)已弃用它?

在什么方面它更符合ISO C ++标准,而ISO标准更符合它?

不幸的是我无法访问实际的ISO C ++标准,虽然我确实查看了最后一个免费提供的C ++ 11草案(N3337),但它没有提到我能看到的这些功能。

我的理由是我经常调用这些POSIX函数,但是我不想根据已弃用的标准编写代码。

1 个答案:

答案 0 :(得分:5)

仅弃用旧名称,而不是函数,仅在Visual Studio中,而不在POSIX中。

基本上,原因是mkdir未定义为ISO C ++标准中的运行时库函数,而非标准运行时库函数应以下划线开头。因此,Microsoft已将下划线添加到运行时库中的所有非标准函数名称。其中大多数是类似POSIX的功能,但有一些特定于Windows的功能。

定义保留供实现使用的标识符的标准部分是2.10,第3段。据我所知,标准没有显式声明实现不能使用其他标识符,但可能是隐含的事实是这样的实现将无法构建合法的C ++程序,恰好以不兼容的方式使用相同的名称。

在这种特殊情况下,只有当程序包含相关的实现定义的头文件时才会出现这种情况,所以我不相信ISO C ++确实要求 Visual Studio来弃用旧名称,但似乎微软认为它确实存在,或者使用保留标识符是最佳做法。 (或者应该不鼓励能够按原样编译POSIX源;请选择!)

附加说明:我认为命名冲突也可能在链接期间导致更复杂的程序出现问题,即使未包含实现定义的标头也是如此。但是,在这种情况下,弃用函数实际上有帮助还不清楚,因为旧的名称仍然存在于库中。 (但是,它们位于不同的.lib文件中,也许这会以某种方式改善问题。)

You can download the November 2014 working draft of the current ISO C++ standard here.