【问题标题】:implicit declaration of function 'getch'函数“getch”的隐式声明
【发布时间】:2015-04-13 18:12:46
【问题描述】:

我有一个简单的程序:

#include <stdio.h>
#include <stdlib.h>

int main(void){
    printf("Hello world!\n");

    getch();

    return 0;
}

即使我收到警告

implicit declaration of function 'getch'

程序运行良好。我错过了什么吗?如果我这样做了,为什么程序可以正常工作?

【问题讨论】:

  • getch()getchar()?
  • 非标准的getch()conio.h(也是非标准的)中,你没有包括在内。它“有效”是因为返回类型与编译器假定的隐式返回类型兼容:int。简而言之,你是(不)幸运的。考虑改用getchar()
  • 感谢@WhozCraig 的评论(如果这是我很乐意接受的答案)
  • 我为投反对票而挠头。这个问题有什么问题吗?请帮我提高downvoter。
  • 问题投票的工具提示包括评论“...显示研究成果”,也许就是这样(不是我)。 MSVC 编译器警告更有帮助:“警告 C4013:'getch' 未定义;假设 extern 返回 int”

标签: c


【解决方案1】:

你收到警告

implicit declaration of function 'getch'

因为您没有包含任何声明 getch 的标头。在标准头文件&lt;stdio.h&gt;&lt;stdlib.h&gt; 中没有声明这样的函数。

事实上,any标准C头文件中并没有名为getch的函数。

在 C99 标准之前,C 语言允许调用没有可见声明的函数。这样的调用实际上会创建一个返回 int 的函数的隐式声明,并采用您实际传递的任何(提升的)类型的参数。

依赖于此从来都不是一个好主意。你应该总是有一个适当的#include 指令用于声明你在程序中使用的任何库函数的标头。

C99 放弃了“隐式int”规则,并对没有可见声明的函数进行任何调用违反约束,需要进行诊断(允许该诊断为非致命错误.)

如果你在 Windows 上编译,如果我没记错的话,&lt;conio.h&gt; 中声明了一个 getch() 函数。如果你想使用该功能,你需要在你的程序中添加#include &lt;conio.h&gt;

我不建议这样做;使用getch() 是不必要的,并且会使您的程序不可移植。一些 Windows 开发环境难以运行“控制台程序”(打印到标准输出而不是创建 GUI 的程序);经常运行这样的程序会创建一个临时窗口,该窗口会在程序完成后立即销毁。调用标准getchar() 函数是防止窗口消失的另一种方法。或者您可以从命令提示符处执行程序,其输出将出现在您当前的命令窗口中。

如果您在类似 UNIX 的系统上进行编译,还有另一个名为 getch() 的函数,在 &lt;curses.h&gt; 中声明。如果我将-lcurses 添加到编译器命令行,我可以在 Linux 上编译和执行你的程序。但是,如果您还没有首先设置 curses 环境,那么您不应该使用 getch() 函数,而且很明显您不想这样做。

理想情况下,经典的“hello world”程序应该是:

#include <stdio.h>
int main(void) {
    printf("Hello world!\n");
    return 0;
}

如何让它运行并让你看到输出取决于你的环境(你没有告诉我们)。

【讨论】:

  • 我在 Windows 7 机器上,code::blocks ide,gcc 编译器。我只想让程序停止并按一个键退出。 getchar() 工作正常,但我也必须按 enter。感谢您的时间和详细的回答:)
  • @jimjim:你可以直接按,不需要先输入另一个字符。你可以试试printf("Type &lt;return&gt; to quit: "); fflush(stdout); getchar();。或者您可以从命令窗口运行程序并让它运行完成。 (可能有一种方法可以在你的环境中调用 Windows getch(),但我不知道细节。可能就像添加 #include &lt;conio.h&gt; 一样简单。)
  • 在 gcc 上为什么需要停止程序?
【解决方案2】:

对于 linux,使用以下代码:

#include <stdio.h>
#include <termios.h>
#include <unistd.h>

int getch (void)
{
        int ch;
        struct termios oldt, newt;

        tcgetattr(STDIN_FILENO, &oldt);
        newt = oldt;
        newt.c_lflag &= ~(ICANON|ECHO);
        tcsetattr(STDIN_FILENO, TCSANOW, &newt);
        ch = getchar();
        tcsetattr(STDIN_FILENO, TCSANOW, &oldt);

        return ch;
}

对于 Windows,添加以下行:

#include <conio.h>

【讨论】:

  • 感谢您的回答。我正在使用 Windows 7。
  • 由于问题中没有澄清,所以这个答案似乎是参考gcc...
  • 也许解释一下,这是将终端从行模式切换到字符模式,然后再返回。
【解决方案3】:

为了使用 getch(),我被困在 Mac 中,因为我想在特定条件下停止屏幕,所以我是这样想的:

#include <stdlib.h>



int main()

{

 system( "read -n 1 -s -p \"Press any key to continue...\"" );

 return 0;

}

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 2021-01-20
    • 1970-01-01
    • 2014-06-28
    • 2022-01-16
    • 2011-10-05
    • 2013-10-28
    • 2019-07-16
    • 2017-07-16
    相关资源
    最近更新 更多