我知道函数getch()
在conio.h
中但是我的编译器似乎运行getch()
非常好,即使我没有包含conio.h
。我使用的是DevC ++。
我不想在不包含库conio.h
的情况下编写代码,但今天我在课堂上进行了测试。其中一个问题是要求C程序的输出包含函数getch()
但没有库conio.h
。我的一位朋友刚回答"编译错误"但老师说使用getch()
而不包括conio.h
完全没问题。
编写代码而不包含库是没关系的,它会影响程序吗?
答案 0 :(得分:1)
这取决于编译器...... conio.h是一个C头文件,主要由MS-DOS编译器使用来提供控制台输入/输出。[1]它不是C标准库的一部分,也不是ISO C,也不是由POSIX定义的。 在现代编译器中,不使用conio.h。
答案 1 :(得分:1)
有两种实体可以读取C源代码:编译器(我猜解释器)和程序员。
如果您没有包含相应的标题,编译器必须猜测程序使用的任何库函数的原型。对于像getch()
这样的简单函数,猜测可能是正确的,但情况并非总是如此。不正确的猜测会导致神秘的错误。
因此,如果由于某种原因您不想包含特定标题,您应该(至少)明确地为您使用的函数提供正确的原型。
然而,虽然编译器可以容忍各种草率的编码,但它被认为是不好的做法,会给代码的人类读者带来这种邋。。几个月或几年之后,人类读者可能就是你自己。因此,让自己和其他查看代码并使代码尽可能易于阅读的人变得轻松。
大多数长期程序员都会同意阅读旧的源代码可能会令人尴尬。因此,现在养成良好的编码习惯,避免以后的尴尬。 :)
正如其他人所说,conio.h和getch()都是非标准的,所以包括conio.h在内的任何人都可以立即知道谁在读取你的代码,并将其定位到Microsoft环境,因此可能需要进行重大修改在任何其他类型的系统上运行。
PS。如果某些Microsoft编译器在需要时自动包含conio.h甚至stdio.h或stdlib.h,那我至少不会感到惊讶......
答案 2 :(得分:0)
头文件包含函数原型等。较旧的C编译器(例如Microsoft Visual Studio支持的编译器)将函数原型(如果未提供)默认为返回int
的函数。这可能就是这里发生的事情。
你应该警告它已经默认了原型。如果没有,那么您可能会包含另一个包含conio.h
的头文件,或者您可能正在不需要它的环境中编译(正如其他人所说的那样)。