【问题标题】:getch() is working without conio.h - how is that possible? [duplicate]getch() 在没有 conio.h 的情况下工作 - 这怎么可能? [复制]
【发布时间】:2013-04-09 10:15:03
【问题描述】:

我开始使用 Visual Studio 2010 (c++) 编写 C 代码。

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

int main(){
    printf("test");
    getch();
    return 0;
}

此代码有效,即使没有添加 conio.h 库并且程序在此处暂停,但是 getch();带有下划线并且它说 错误标识符 getch();未定义

这怎么可能?

【问题讨论】:

  • 只是猜测,但也许 stdio.h 会引入 conio.h 的(某些部分)?从技术上讲,只要代码不使用 C++ 特性,您就可以使用函数而不声明它们(但您应该启用警告以避免这种情况)。
  • 我打开stdio和stdlib,crtl+f搜索了getch(),但是只有原来的getchar()...
  • 我敢打赌这两个标题都包含其他内容。
  • 也许它是 printf() 中的一个特殊函数,在没有 stdio.h 的情况下使用 gcc 编译时可以工作。甚至 getch() 也可以在没有任何标题的情况下与 gcc 一起使用
  • "... 不添加 conio.h 库 ..." conio.h 不是 一个库,而是一个提供 (除了其他东西)原型到库中的函数。编译期间不使用库,而是编译后,即链接期间。

标签: c visual-studio-2010


【解决方案1】:

C 语言对函数有“隐式声明”的概念。如果您不提供原型,编译器将假定函数声明如下:

int getch();

意味着它是一个返回 int 的函数,它没有指定有关其参数的信息。严格来说这不是错误,但是如果您的警告级别设置得足够高,许多编译器会发出警告。从 C99 开始,此行为已被删除,您通常应避免依赖它。

由于库仍然提供getch() 函数,因此在链接时解析其符号没有问题。结果,由于getch() 实际上确实返回了int,所以一切正常。

【讨论】:

    猜你喜欢
    • 2021-02-28
    • 1970-01-01
    • 1970-01-01
    • 2016-10-07
    • 2017-09-23
    • 1970-01-01
    • 1970-01-01
    • 2016-05-15
    • 2020-10-19
    相关资源
    最近更新 更多