微软强调C函数的目的是什么?

时间:2016-06-15 20:27:38

标签: c visual-studio posix deprecated msvcrt

这个问题与strdup or _strdup?的主题相同,但不一样。这个问题询问如何解决 MS的重命名问题,这个问题要求为什么他们首先做到了

出于某种原因,Microsoft已经采用了大量的POSIX C函数,并且已经弃用并用_替换它们 - 前缀变量。其中一个例子是isatty

https://msdn.microsoft.com/en-us/library/ms235388.aspx

This POSIX function is deprecated. Use the ISO C++ conformant _isatty instead.

ISO C ++与_isatty一致的内容是什么?在我看来,MSDN的帮助是完全错误的。

其他问题的答案解释了如何处理这个问题。您添加_CRT_NONSTDC_NO_DEPRECATE定义。精细。但我想知道微软的想法是什么。他们在重命名和弃用函数方面有什么意义?是不是让C程序员的生活更加艰难?

3 个答案:

答案 0 :(得分:11)

如果您认为_isatty()符合ISO C ++标准,那么它就像“语言律师”一样。

在ISO C ++下,编译器只应提供标准中的函数(至少对于标准头文件) - 它们不允许自由添加额外函数,因为它可能与代码中声明的函数冲突被编译。由于isatty()未在标准中列出,因此在标准头中提供isatty()函数将不符合ISO C ++。

但是,标准允许编译器提供它想要的任何函数,只要该函数以单个下划线开头即可。所以 - 语言律师时间 - _isatty() 符合ISO C ++。

我认为这是导致错误信息被表达的逻辑。

(现在,在这种特殊情况下,isatty()是在io.h中提供的,它实际上并不是C ++标准头文件,所以从技术上来说,Microsoft 可以提供它并仍然声称是标准 - 但是,他们还有其他不兼容的函数,比如string.h中的strcmpi(),它是标准的头文件。因此,为了保持一致性,他们以相同的方式弃用了所有POSIX函数,并且它们都报告了相同的错误消息。 )

答案 1 :(得分:2)

以下划线开头的名称(如_isatty)保留用于实现。它们没有ISO C ++定义的含义,也没有ISO C定义的含义,您不能将它们用于您自己的目的。所以微软完全正确使用这个前缀,而POSIX实际上是错误的。

C ++有名称空间,所以一个hypthetical" Posix C ++"可以定义namespace posix,但POSIX基本上已经化石化 - 在该领域没有新的创新。

答案 2 :(得分:0)

isatty&虽然POSIX不是标准C,但是由VC ++运行时 1 提供为“扩展”。

因此,它们以下划线作为前缀,以避免名称冲突 - 因为以下划线后跟小写字母开头的名称是为全局范围内的实现定义的内容保留的。因此,例如,如果您想使用实际的POSIX兼容层提供这些函数的自己的版本,他们就不必与VC ++斗争 - 为非强制名称提供“假”。

  1. 顺便说一下,没有推定实际上符合POSIX标准的扩展。