繁体   English   中英

C / C ++中的#include标头

[英]#include headers in C/C++

在阅读了有关编译问题的几个问题(特别是C ++)并注意到在许多情况下问题是缺少标题#include。 我忍不住想知道我的无知并问自己(现在对你):

为什么缺少标题不会自动检查并添加或要求程序员?

例如,此类功能可用于Netbeans中的Java导入语句。

还记得java.util.Datejava.sql.Date之间的Java冲突吗? 如果有人在他们的代码中使用Date ,则无法判断他们是否忘记import java.util.Dateimport java.sql.Date

在Java和C ++中,无法确定缺少哪些import / include语句。 所以两种语言都没有尝 您的IDE可能会为代码中使用的未声明符号提供建议。

C ++中的问题更加复杂,因为标准规定任何标准头文件都可以包含任何其他标准头文件。 因此,在不直接包含定义它的头的情况下使用函数或类非常容易,因为您的编译器恰好间接包含了正确的头。 根据它们是否共享该头依赖性,生成的代码在某些实现中起作用,但在其他实现中起作用。

一般来说,C ++ IDE无法判断标头依赖性是否“有保证”,或者仅仅是用户不应依赖的附带实现细节。 显然,对于标准库,它可以只知道在什么标题中定义了什么,但是一旦到达第三方库,它就变得非常不确定。

我认为大多数C ++程序员都希望查找哪些标头定义了哪些符号。 使用Java,one-public-class-per-file规则大大简化了这一点,您只需导入所需的包/类。 C ++没有包,IDE找到名为my_namespace::something::MyClass的类的唯一方法是在每个头文件中搜索它。

为什么缺少标题不会自动检查并添加或要求程序员?

但它们会自动检查。

  1. 当找不到标题时,我的编译器无法编译。
  2. 我的IDE(eclipse)添加了一个视觉线索,当它找不到我已经#include的头文件时,它会强调#include行,并提供一个工具提示,告诉我问题是什么。

它不会自动添加一个包含因为它无法知道哪些包含我忘了。 编译器不是通灵的。

最后我记得,如果错过了Import语句,Java也会抛出错误。 NetBeans GUI使您的生活更轻松。

可能你应该尝试为你的C / C ++代码找到一个智能的GUI。

因为第二个你信任计算机为你思考 ,你手上有一个重大的SkyNet案例。

一般而言,计算机在做出选择时非常糟糕,除非是非常简单的。 从依赖地狱中拉出一些东西根本不是你应该委托给它的任务,因为那种思维导致了草率的编码和错误的代码。

如果我引用一个名为sqrt的函数,编译器如何知道要查找哪个文件,如果我没有指定它? 它可能绝对是我整个硬盘上的任何文件。

与Java不同,C ++并不真正认为任何文件“特殊”。 Java有它的巨型(臃肿)类库,程序员可以自动访问它。

在C ++中,这个概念不存在。 您告诉编译器要搜索哪些路径,每当#include文件时,它将在这些路径中搜索文件名。

如果碰巧找到标准库文件,它将使用它。 如果碰巧找到第三方文件,它会使用它。

编译器不知道math.h定义了sqrt 或者,它通常限定cmath实际上,通过一个报头中定义的功能可能会有所不同 也许,如果我#define适当的预处理器符号,一些函数将从特定的标题中删除,其他函数将被启用。

但是与Java不同,Java只能通过检查库文件的元数据来确定库定义的函数和类,而在C ++中,必须编译头文件。 编译它的结果可能会有所不同,具体取决于包含它的上下文。

因此,C ++编译器无法猜测应该包含哪个头,以便定义您刚刚使用的函数。

编译器不应该为你考虑。 如果两个不同的库中有相同名称的功能怎么办? 如何知道要包含哪个标头以及要链接哪个库? 在我看来,让编译器或IDE默默地修复你的草率代码是一个坏主意。

部分差异是由于一些基本设计决策在两者之间做出了不同的决定。 特别是,Java要求类的名称与文件名匹配,因此您使用的类的名称几乎告诉它您需要导入的内容。

在C或C ++中,您为标题指定的名称不一定必须与内容匹配。 如果你想要足够严重,你可以命名你的标题1.h,2.h,3.h等等 - 甚至1.bas,2.pas,3.java,4.ada等等你喜欢的误导性名字。 这显然是一个糟糕的主意,但如果你这样做了,编译器就不会受到打扰。

因此,C或C ++工具更难以猜测需要包含哪个头来获取特定类型的定义。 从理论上讲,它可以(例如)在你编写的所有头文件中构建一个包含所有函数,类,类型等的大数据库,当你使用它时,告诉你哪个头定义了什么名称,但我不知道IDE实际上是这样做的。

NetBeans是一个IDE(集成开发环境)。 有些C / C ++ IDE确实有这个功能......但不是每个人都知道它或利用它。

因为一般来说,知道需要包含哪些头文件来正确定义内容是一个难题。 让你的IDE能够猜出简单的案例并提供帮助是一个非常好的功能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM