gpt4 book ai didi

c - 第二次编译时getch未定义

转载 作者:行者123 更新时间:2023-11-30 19:05:18 25 4
gpt4 key购买 nike

我正在使用 Visual Studio 2017 。

首先我编写了以下代码:

void main()
{


printf("abcdefgh %d hjhjh %d", 5, 6);

getch();



}

它运行得很好。

但之后我将代码修改为以下内容:

void main()
{
char abc[100];

strcpy_S(abc, "premraj");
printf("%s", abc);

printf("abcdefgh %d hjhjh %d", 5, 6);

getch();



}

但现在我收到了 getch 的错误,指出“'getch' 未定义,假设 extern 返回 int”

但是这个新代码是建立在已经完美识别getch的代码之上的,怎么第二次就不能识别getch了呢?

我检查了以下问题:

getch() is working without conio.h - how is that possible?

它也有类似的问题,但在这里仅进行修改我就得到了这个错误。

名为“ fatal error ”的用户提供了一个内容丰富的答案,但我仍然想知道修改后出现的这个有趣的现象。这背后的原因是什么?

P.S:以下是我第一次的头文件声明:

#include <stdio.h>

第二次如下:

#include <stdio.h>
#include <string.h>

最佳答案

曾几何时,如果您调用编译器从未听说过的函数,如下所示:

#include <stdio.h>
int main()
{
int x = foo();
printf("%d\n", foo);
}

无论如何,如果您这样做,编译器会悄悄地假设 foo() 是一个返回 int 的函数。也就是说,编译器的行为就像您键入了

extern int foo();

在你调用foo之前的某个地方。

但我认为,在 C99 中,语言发生了变化。调用未明确声明的函数不再合法。因为有很多很多代码是根据以前的规则编写的,所以大多数编译器不会立即开始拒绝旧式代码。有些人继续悄悄地假设无法识别的函数返回了int。其他人 - 比如你的 - 开始吵闹假设无法识别的函数返回int,沿着“'foo'未定义,假设extern返回int”发出警告。

听起来你的问题是,不久前,包含对 getch() 调用的代码在没有警告的情况下被接受,但今天,你收到警告“'getch' undefined,假设外部返回 int”。发生了什么变化?

一种可能是您的代码略有更改。如果您的代码曾经包含该行

#include <conio.h>

在某个地方,该文件将包含类似的声明

extern int getch();

这将为编译器提供所需的声明,并且您不会收到警告。但是,如果今天您的代码不包含 #include 行,那就解释了为什么开始出现警告。

也有可能您的编译器已发生某种变化。您可能正在使用新版本的编译器,这更加挑剔,已经从悄悄假设变成了正常假设。或者,您的编译器选项可能已更改。许多编译器可以配置为接受该语言的不同变体,对应于多年来发布的语言标准的不同版本。例如,如果不久前您的编译器正在针对语言标准“C89”进行编译,但今天,它正在执行“C99”或“C11”,那就可以解释为什么它现在会因为此警告而产生噪音。

编译器中的更改可能是系统管理员配置的默认值的更改,或者调用编译器的方式的更改,或者项目 Makefile 的更改,或者语言设置的更改在你的 IDE 中,或者类似的东西。

还有几点:

  • getch 不是标准 C 函数;它是 Windows 特有的。一般来说,如果您不使用它,您的程序将更可移植。你确定你需要它吗? (我知道它的用途;我不知道是否有其他方法可以在 if 退出后将程序的输出窗口保留在屏幕上。)
  • 您应该养成将 main() 声明为 int 而不是 void 的习惯。 (void 可以很好地工作,但它是不正确的,如果不出意外的话,您会收到很多关于它的负面评论。)
  • 我认为您对 strcpy_S 的调用也有问题

关于c - 第二次编译时getch未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50089114/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com