头文件和命名空间有什么区别?

19
我想知道Header文件(例如MyHeader.hpp)和C++中的命名空间之间的确切区别是什么?
6个回答

24

头文件是实际的文件 - 存储在文件系统中,通过文件名引用,并在其他文件中使用#include包含(至少在C/C++或使用M4宏预处理器的其他语言中如此)。头文件通常将所有相互依赖的代码片段组合在一起,形成同一特定项的部分。例如,一个游戏可能为其所有图形渲染设置了一个头文件。

而命名空间则是编程语言的一个元素 - 它们不存在于文件系统对象中,而是作为代码中的指定,告诉编译器某些东西在该命名空间内。命名空间通常将相似(但不一定相互依赖)项的接口(函数、类/结构体、类型)分组。例如,在C++中,std命名空间包含所有标准库函数和类。


18

要知道什么是头文件,你需要了解“声明”的含义。

简单来说,在C/C++中,编译是按每个源文件进行的。假设我有一个A.cpp文件,在里面使用了一个函数foo(),该函数将在其他地方定义,我需要告诉编译器:“嘿,我正在使用foo(),虽然你看不到它在我的源代码中定义,但不用担心,它在另一个源文件中定义”。通过在A.cpp中“声明”foo()的方法来告诉编译器。

如果我是foo()函数的作者,那么每个使用foo()的人都需要在他们的源文件中写入声明 void foo();这将产生大量重复且无意义的工作。而且很难让使用foo()的人正确地声明它。因此,作为foo()函数的作者,我会编写一个包含使用foo()声明的文件,并分发它以便人们可以将文件内容“导入”到他们的源代码中。我所分发的文件就是头文件。在C/C++中,导入文件的操作是 #include 。是的,#include仅是将所包含文件的内容插入到#include处的位置。


命名空间是另一回事。简单地说,你可以把它看作是函数/类等的“真正”名称。例如,如果我编写

namespace FOO {
  class Bar { }
}

这个类的真正名称并不是Bar,它的实际名称实际上是FOO :: Bar。

C++ 提供了一些方式通过“使用”省略冗长的真实名称。


5
一个头文件是一个旨在被源文件包含的文件。它们通常包含某些类和函数的声明。
命名空间使代码能够将标识符分类。也就是说,类、函数等可以放置在命名空间中,使其与其他不相关的类分开。例如,在C++中,标准库中的所有内容都在std命名空间中。

头文件包含原型和声明。 - 2easylogic
@Vish:你是在告诉我还是在问我?严格来说,原型并不存在;那只是一个声明。 - GManNickG

0

命名空间是“ansi c++”中的一个新概念,用于标识在程序中经常使用的全局标识符。

头文件是支持您的程序的源文件,通过重用可靠和经过测试的代码来节省时间和精力!!!


你的回答包含了一些有用的信息,如果你在写可读的英语方面付出更多努力并提供更多细节,它可能会得到更好的接受。希望你在StackOverflow上有一个愉快的体验! - spruceb
谢谢!我做了一些编辑。下次我会进一步完善它们。 - Jayraj Srikriti Naidu

0

-4

命名空间是给头文件取的新词,为了让新版本可用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接