函数'getch'的隐式声明

时间:2015-04-13 18:12:47

标签: c

我有一个简单的程序:

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

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

    getch();

    return 0;
}

即使我收到警告

implicit declaration of function 'getch'

程序运行正常。我错过了什么吗?如果我这样做,为什么程序运行正常?

3 个答案:

答案 0 :(得分:10)

你收到警告

implicit declaration of function 'getch'

因为您没有包含声明getch的任何标头。标准标题<stdio.h><stdlib.h>中未声明此类函数。

事实上,任何标准C标头中都没有名为getch的函数。

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

根据这一点从未有过好主意。您应该始终对标头有一个正确的#include指令,该标头声明您在程序中使用的任何库函数。

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

如果你在Windows上进行编译,如果我没记错的话,getch()中会声明<conio.h>函数。如果您想使用该功能,则需要将#include <conio.h>添加到您的程序中。

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

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

理想情况下,经典的“hello world”计划应该只是:

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

如何运行并让您看到输出取决于您的环境(您尚未告诉我们)。

答案 1 :(得分:5)

对于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>

答案 2 :(得分:0)

由于要在特定条件下停止屏幕显示,我陷入了Mac的使用getch()的局面,所以这里是我的想法:

#include <stdlib.h>



int main()

{

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

 return 0;

}

希望有帮助。