我有一个简单的程序:
#include <stdio.h>
#include <stdlib.h>
int main(void){
printf("Hello world!\n");
getch();
return 0;
}
即使我收到警告
implicit declaration of function 'getch'
程序运行正常。我错过了什么吗?如果我这样做,为什么程序运行正常?
答案 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;
}
希望有帮助。