getch()和_getch()的区别

5

conio.h头文件中定义的两个函数getch()和_getch()有什么区别?

它们的声明有区别吗?还是因为更新的标准而有所不同?

2个回答

9
几年前,微软决定更加严格地解释C++标准。其中规定在全局命名空间中以下划线开头的所有名称都“保留供实现使用”。这意味着“getch”不是保留名称,但是“_getch”是。
因此,微软认为,“该函数和每个其他POSIX函数都是由实现提供的。让我们通过添加下划线来重命名它们,以便我们能够将其保留在全局命名空间的‘保留’部分内。这样,就不会与用户提供的函数发生名称冲突。”
您可以说这些是良好的意图,也可以说这只是破坏POSIX代码的邪恶尝试。我不知道他们真正的动机是什么,但最终结果是根据微软的说法,“getch”已被弃用,应改用“_getch”。

+1 对于背景解释的说明很好。 - Bartek Banachewicz
е“Әз§ҚPOSIXд»Јз ҒдјҡеҮәй—®йўҳпјҹPOSIXзҡ„getch()жҳҜcursesзҡ„дёҖйғЁеҲҶпјҢеӣ жӯӨд»»дҪ•дҫқиө–дәҺgetch()зҡ„POSIXд»Јз ҒйғҪйңҖиҰҒ移жӨҚcursesгҖӮ - n. m.
17.4.3.1.2 全局名称 1 某些名称和函数签名集始终保留给实现:
  • 任何包含双下划线(__)或以下划线后跟大写字母(2.11)开头的名称都保留给实现以供任何用途。
但这不适用于_gecth。
- Paul
@n.m. 好的,我不确定 getch 是否是 POSIX 规范的一部分,还是来自其他库。我知道他们对所有 POSIX 函数都进行了这种处理,而且快速谷歌 getch 提到了 POSIX,所以我认为它是一个 POSIX 函数。如果不是,那也没有什么改变,因为他们的重命名不仅限于 只有 POSIX 名称。 - jalf
1
@Paul:这是哪个版本的C++标准?在N3290的17.6.4.3.2下,我看到“以下划线开头的每个名称都保留给实现,用作全局命名空间中的名称。”(类似措辞出现在C++98规范中) - jalf
@jalf:所有的C++标准版本都有相似的规则。有两组不同的保留名称集合。其中一组是保留为任何类型的名称(内部、外部、宏等),另一组是保留为全局命名空间中的名称。 - n. m.

2

这两个函数都是非标准的(即它们不在C++ ISO标准中)。它们是由您特定的工具链提供的扩展,因此,您必须检查其文档中的差异。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接