C / C ++中的#include标头

时间:2010-03-22 14:09:51

标签: c++ c include header

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

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

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

9 个答案:

答案 0 :(得分:12)

还记得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 :(得分:7)

  

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

但他们会自动检查。

  1. 当找不到标题时,我的编译器无法编译。
  2. 我的IDE(eclipse)添加了一个视觉线索,当它找不到我已#include的头文件时,它会强调#include行并提供一个工具提示,告诉我问题是什么。
  3. 它不会自动添加包含因为它无法知道哪些包含我忘记了。编译器不是通灵的。

答案 2 :(得分:4)

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

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

答案 3 :(得分:2)

因为您信任计算机的第二个想法,所以您手上有一个重要的SkyNet案例。

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

答案 4 :(得分:2)

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

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

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

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

编译器不知道 sqrt在标头math.h中定义。或者通常在cmath中定义。事实上,标题定义的函数可能变化。也许,如果我#define适当的预处理器符号,一些函数将从特定的标题中删除,其他函数将被启用。

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

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

答案 5 :(得分:1)

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

答案 6 :(得分:1)

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

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

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

答案 7 :(得分:0)

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

答案 8 :(得分:0)

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