繁体   English   中英

函数'getch'的隐式声明

[英]implicit declaration of function 'getch'

我有一个简单的程序:

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

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

    getch();

    return 0;
}

即使我收到警告

implicit declaration of function 'getch'

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

你得到警告

implicit declaration of function 'getch'

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

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

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

依赖于这一点从来都不是一个好主意。 对于声明在程序中使用的任何库函数的标头,您应该始终有一个正确的#include指令。

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

如果您在 Windows 上编译,如果我没记错的话,在<conio.h>声明了一个getch()函数。 如果您想使用该功能,您需要将#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;
}

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

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

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

#include <stdlib.h>



int main()

{

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

 return 0;

}

希望能帮助到你。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM