[英]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.