这篇MSDN文章指出getcwd()已被弃用,而且应该使用ISO C++兼容的_getcwd,这就提出了一个问题:是什么让getcwd()不符合ISO标准?
对此进行了很好的讨论.PJ Plauger回答了这个问题
我是那个在1983年坚持认为可以将C程序可用的名称空间划分为:
a)为程序员的利益而定义的那些(例如printf)
b)为程序员保留的那些(例如foo)
c)为实现保留的那些(例如_unlink)我们甚至知道"实现"过于单一 - 通常不止一个源提供实现的部分 - 但这是我们当时可以做的最好的.标准C++已经引入了命名空间来帮助,但它们只实现了其既定目标的一小部分.(这就是当你标准化纸老虎时会发生的事情.)
在这种特殊情况下,Posix提供了一个类别(a)名称列表(例如取消链接),当您包含某些标题时,您应该定义这些名称.由于C标准从Unix中窃取了它的标题,这与Posix的源头相同,因此其中一些标题在历史上重叠.然而,编译器警告应该有某种方式考虑支持的环境是"纯粹的"标准C++(柏拉图式理想)还是混合C/C++/Posix环境.微软目前帮助我们糟糕的程序员的尝试未能将其考虑在内.它坚持将unlink视为一个类别(b)名称,这是近视.
好吧,GCC不会在严格的C模式下声明POSIX名称,至少(尽管它仍然在C++模式下):
#includeint 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没有这种可能性.
标准中未指定的功能应该以下划线为前缀,表示它们是特定于供应商的扩展或符合非ISO标准.因此,此处的"合规性"是Microsoft为此特定功能的名称添加下划线,因为它不是ISO标准的一部分.