是否有一种简单的,跨平台的方法使用Phobos在D2中获得单个击键?

例如,“按任意键继续...”提示或Brainfuck解释器。

我尝试过的所有方法在传递输入(例如,getchar())之前都需要Enter键。

最佳答案

我对此事进行了一些研究,发现虽然D 1.0下的Phobos库确实具有std.c.stdio.getch()形式所需的内容,但D 2.0缺少此功能。 Phobos中的其他标准输入功能似乎都没有您想要的行为。

据我了解,这是因为所需的行为(即无需Enter键即可获得单个字符)是相当不规范的,必须以相对丑陋,特定于平台的方式实现。 (函数的初始形式getch存在于C的<conio.h>中,C是特定于DOS的标头,尽管它不是标准C库的一部分,但实际上已成为事实上的跨平台标准。) Phobos运行时库决定以清理器库的名义去除此特定的向后兼容功能,但要以牺牲此功能为代价。

手动申报

Reportedly,可以通过将其添加到源文件中来解决此丢失的函数声明:

extern (C) int getch();


但是,我发现这会产生一个链接器错误,表明该函数已从运行时库中完全删除,而不是仅仅从std.c.stdio中删除​​了它的声明。当然值得一试-它确实可以在您的系统和编译器上运行,我真的不知道。

编辑2:这实际上似乎在Windows上工作;在Linux方面对我来说失败了。看来Windows下的DMD首先链接到Phobos / D运行时(phobos.lib),然后是C运行时(snn.lib);但是,在Linux上,DMD链接到一个提供两个部分的运行时库。这种差异似乎导致与未声明功能(其中的getch)的链接仅在Windows上有效。如果Windows是您关注的唯一平台,则此解决方案可能是合适的。如果您需要更多的跨平台兼容性,请继续阅读。

诅咒

另一种可能性是使用ncurses库。它实现了一个getch函数,该函数肯定会满足您的要求-前提是您很乐于为库找到D绑定,或者仅使用C接口即可。请注意,它不仅需要调用所需的函数,还需要更多的设置。 this thread对此有更多信息。

D 1.0

现在,为一些非常丑陋的解决方案。使用D 1.0可以使您在Phobos标准库中找到所需的内容-但这显然需要使用语言的更老版本,我个人认为标准库中缺少一个控制台IO功能是没有道理的使用旧版本的D。

我相信Tango在切换到D 2.0时也丢失了getch声明(在tango.stdc.stdio下),但是我对Tango的了解非常有限,所以我可能是错的。

自己写

如果确定,您可以编写自己的getch。我无法使用Google Code Search找到getch的跨平台C实现,这使我对可能仅适用于D的相对简单的10行左右函数实现的可能性感到悲观。 。

另一方面,Walter Bright(您是设计D语言的人)提供了此类功能here的D实现。但是,即使这样似乎也有些过时,因为在当前版本的DMD2编译器中未定义符号cfmakeraw。但是,它确实接近可行的解决方案。

09-04 21:13