函数'getch'的隐式声明

jim*_*jim 8 c

我有一个简单的程序:

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

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

    getch();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

即使我得到了警告

implicit declaration of function 'getch'
Run Code Online (Sandbox Code Playgroud)

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

Kei*_*son 10

你收到了警告

implicit declaration of function 'getch'
Run Code Online (Sandbox Code Playgroud)

因为您没有包含任何声明的标头getch.没有这样的功能是在标准头文件中声明<stdio.h><stdlib.h>.

实际上,getch任何标准C头中都没有命名的函数.

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

根据这一点,从来没有一个好主意.您应始终#include对标头声明一个适当的指令,该标头声明您在程序中使用的任何库函数.

C99删除了"隐式int"规则,并且对没有可见声明的函数的任何调用都违反约束,需要诊断(允许该诊断是非致命错误.)

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

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

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

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

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

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

  • @jimjim:你可以按<enter>,不需要先输入另一个字符.您可以尝试类似`printf("Type <return> to quit:"); fflush(stdout中); 的getchar();`.或者,您可以从命令窗口运行程序并让它运行完成.(可能有一种方法可以在你的环境中调用Windows`getch()`,但我不知道细节.它可能就像添加`#include <conio.h>`一样简单.) (2认同)

Dea*_*nie 6

对于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;
}
Run Code Online (Sandbox Code Playgroud)

对于Windows,请添加以下行:

#include <conio.h>
Run Code Online (Sandbox Code Playgroud)