微软下划线 C 函数的目的是什么?
What is the purpose of Microsoft's underscore C functions?
这个问题和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.
关于 _isatty
的 ISO C++ 究竟符合什么?在我看来,MSDN 的帮助是完全错误的。
其他问题的回答解释了如何处理这个问题。您添加 _CRT_NONSTDC_NO_DEPRECATE
定义。美好的。但是我想知道微软的想法是什么。他们重命名和弃用函数的意义何在?难道只是为了让 C 程序员的日子更难过吗?
以下划线开头的名称,如 _isatty
保留用于实现。它们没有由 ISO C++ 或 ISO C 定义的含义,您不能将它们用于您自己的目的。所以微软使用这个前缀是完全正确的,POSIX实际上是错误的。
C++ 有命名空间,所以假设的 "Posix C++" 可以定义 namespace posix
,但 POSIX 基本上已经僵化了——在那个领域没有新的创新。
isatty
& co.,虽然 POSIX,不是标准的 C,并且由 VC++ runtime 作为 "extensions" 提供1.
因此,它们以下划线为前缀,据说是为了避免名称冲突 - 因为以下划线开头后跟小写字母的名称保留用于全局范围内的实现定义的内容。因此,例如,如果您想使用一个实际的 POSIX 兼容层来提供这些功能的自己的版本,他们就不必与 VC++ 提供的 "fake"那些没有下划线的名字。
- 顺便说一句,没有假定实际上 POSIX 兼容的扩展。
如果您将 _isatty() 视为 "language lawyer".
,那么 _isatty() 符合 ISO C++ 的事实是有道理的
在 ISO C++ 下,编译器应该只提供标准中的函数(至少对于标准 headers)——他们不允许随意添加额外的函数,因为它可以与正在编译的代码中声明的函数冲突。由于 isatty() 未在标准中列出,因此在标准 header 中提供 isatty() 函数将不符合 ISO C++ 标准。
但是,该标准确实允许编译器提供它想要的任何函数,只要该函数以单个下划线开头即可。所以 -- 语言律师时间 -- _isatty() 符合 ISO C++。
我相信这就是导致错误消息按原样措辞的逻辑。
(现在,在这种特定情况下,io.h 中提供了 isatty(),这实际上不是 C++ 标准 header,因此从技术上讲,Microsoft 可以 提供它并仍然声称是 standards-conformant。但是,他们还有其他 non-compliant 函数,例如 string.h 中的 strcmpi(),这是一个标准的 header。所以,对于一致性,他们以相同的方式弃用了所有 POSIX 功能,并且他们都报告了相同的错误消息。)
这个问题和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.
关于 _isatty
的 ISO C++ 究竟符合什么?在我看来,MSDN 的帮助是完全错误的。
其他问题的回答解释了如何处理这个问题。您添加 _CRT_NONSTDC_NO_DEPRECATE
定义。美好的。但是我想知道微软的想法是什么。他们重命名和弃用函数的意义何在?难道只是为了让 C 程序员的日子更难过吗?
以下划线开头的名称,如 _isatty
保留用于实现。它们没有由 ISO C++ 或 ISO C 定义的含义,您不能将它们用于您自己的目的。所以微软使用这个前缀是完全正确的,POSIX实际上是错误的。
C++ 有命名空间,所以假设的 "Posix C++" 可以定义 namespace posix
,但 POSIX 基本上已经僵化了——在那个领域没有新的创新。
isatty
& co.,虽然 POSIX,不是标准的 C,并且由 VC++ runtime 作为 "extensions" 提供1.
因此,它们以下划线为前缀,据说是为了避免名称冲突 - 因为以下划线开头后跟小写字母的名称保留用于全局范围内的实现定义的内容。因此,例如,如果您想使用一个实际的 POSIX 兼容层来提供这些功能的自己的版本,他们就不必与 VC++ 提供的 "fake"那些没有下划线的名字。
- 顺便说一句,没有假定实际上 POSIX 兼容的扩展。
如果您将 _isatty() 视为 "language lawyer".
,那么 _isatty() 符合 ISO C++ 的事实是有道理的在 ISO C++ 下,编译器应该只提供标准中的函数(至少对于标准 headers)——他们不允许随意添加额外的函数,因为它可以与正在编译的代码中声明的函数冲突。由于 isatty() 未在标准中列出,因此在标准 header 中提供 isatty() 函数将不符合 ISO C++ 标准。
但是,该标准确实允许编译器提供它想要的任何函数,只要该函数以单个下划线开头即可。所以 -- 语言律师时间 -- _isatty() 符合 ISO C++。
我相信这就是导致错误消息按原样措辞的逻辑。
(现在,在这种特定情况下,io.h 中提供了 isatty(),这实际上不是 C++ 标准 header,因此从技术上讲,Microsoft 可以 提供它并仍然声称是 standards-conformant。但是,他们还有其他 non-compliant 函数,例如 string.h 中的 strcmpi(),这是一个标准的 header。所以,对于一致性,他们以相同的方式弃用了所有 POSIX 功能,并且他们都报告了相同的错误消息。)