为什么getcwd()不符合ISO C ++?

时间:2009-03-15 12:07:58

标签: c++ iso

This MSDN article声明getcwd()已被弃用,而且应该使用与ISO C ++兼容的_getcwd,这就提出了一个问题:是什么让getcwd()不符合ISO标准?

7 个答案:

答案 0 :(得分:24)

有一个good discussionP.J. Plauger这个答案

  

我是1983年坚持回归的人   C程序可用的名称分区为:

     

a)为了程序员的利益而执行的定义(例如printf)
    b)为程序员保留的那些(例如foo)
    c)为实施保留的内容(例如_unlink)

     

我们甚至知道“实施”过于庞大 -   通常不止一个源提供实现的位 -   但这是我们当时能做的最好的事情。标准C ++   已经引入名称空间来帮助,但他们只实现了   他们既定目标的一小部分。 (这就是你发生的事情   标准化纸老虎。)

     

在这种特殊情况下,Posix提供了一个类别(a)名称列表   (例如取消链接)你应该只在你的时候定义   包括某些标题。由于C标准偷走了它的标题   Unix,与Posix的源代码相同,其中一些是标题   历史重叠。然而,编译器警告应该有   某种方式考虑是否支持环境   是“纯粹的”标准C ++(柏拉图式理想)或混合C / C ++ / Posix   环境。目前微软帮助我们穷人的尝试   程序员没有考虑到这一点。它坚持治疗   取消链接作为类别(b)名称,这是近视。

好吧,GCC不会在严格的C模式下声明POSIX名称,至少(尽管它仍然在C ++模式下):

#include <stdio.h>

int main() {
    &fdopen;
    return 0;
}

使用-std=c99

输出
test.c: In function 'main':
test.c:4: error: 'fdopen' undeclared (first use in this function)

您必须明确告诉它您使用功能测试宏在混合C / Posix中操作,或者不传递任何特定标准。然后它将默认为gnu89,它假定混合环境(man feature_test_macros)。显然,MSVC没有这种可能性。

答案 1 :(得分:19)

标准中未指定的功能应以下划线为前缀,表示它们是特定于供应商的扩展或符合非ISO标准。因此,此处的“合规性”是Microsoft为此特定功能的名称添加下划线,因为它不是ISO标准的一部分。

答案 2 :(得分:4)

正如其他人已经指出的那样,getcwd不包含在ISO C ++中,但它是POSIX / IEEE Std 1003.1的一部分。

Microsoft决定在其C标准库中包含一些最常用的POSIX函数(但是这些函数的前缀加上下划线以基本上不鼓励使用它们。)

答案 3 :(得分:3)

据我所知,getcwd()从未成为ISO标准C ++的一部分。 _getcwd()肯定不是,因为标准名称不会以下划线开头。

实际上,MSDN文章链接到一个手册页,该手册页说明它是在 direct.h 中声明的,它不是标准C ++头文件。这篇文章对我来说似乎是假的。

答案 4 :(得分:3)

要添加Dan Olson的帖子:请参阅MSDN上的ANSI C Compliance页面

  

Microsoft特定函数和全局变量的名称以单个下划线开头。这些名称只能在代码范围内本地覆盖。例如,当您包含Microsoft运行时头文件时,您仍然可以通过声明同名的本地变量来本地覆盖名为_open的Microsoft特定函数。但是,您不能将此名称用于您自己的全局函数或全局变量。

答案 5 :(得分:3)

对于记录,ISO未弃用getcwd()。它被微软“弃用”了。微软重写了许多C函数 - 通常考虑到更好的安全性(比如,字符串函数也需要max_length参数)。然后他们让他们的编译器吐出这些警告,我认为这是假的,因为没有标准组弃用任何声明已弃用的函数。

答案 6 :(得分:3)

MSDN的文章在一个普通人只能快速阅读的结论(如果他们没有非常谨慎的律师眼睛阅读)的结论中有点令人困惑。

MSDN文章所说的是:getcwd()不符合ISO C ++标准。为了符合用于命名函数的ISO C ++标准(这是getcwd违反的标准),Microsoft在函数的前面正确地放置了_,因此相同的函数变为_getcwd()。这是符合ISO C ++的命名函数的方式,因为getcwd()和_getcwd()不是ISO C ++标准函数,而是Microsoft(供应商)特定或特定于实现的函数。

这篇文章没有说明获取工作目录的C ++ ISO标准调用是什么......虽然这就是人们快速阅读的内容。