在C++中,#include
指令和using namespace
之间有什么区别?你也将你的名字空间存储为单独的文件,这些文件的文件扩展名是什么?C++:using namespace and #include
回答
为了回答你的问题,我会稍微回过头来看看C和C++的一些基础知识。
编译C/C++时,将源文件编译成实际的可执行文件实际上是两个步骤,即编译和链接。编译步骤一次只接受一个.cpp文件并编译。其他.cpp文件的内容对编译器不可见。这会生成一个“目标文件”(我不知道为什么这样称呼它)。所有的目标文件然后通过链接器链接以产生最终的可执行文件。
这带来了C++中两个重要的概念,声明和定义。声明指定某处(变量或函数)将存在于某处。以下是函数foo()的声明
void Foo();
这意味着我们已经告诉编译器的地方会有一个函数foo(),它没有参数,没有返回值。
定义指定了函数的实际功能。这里定义函数
void Foo() { cout << "Foo!!"; }
让我们定义另一个函数,酒吧()
void Bar() {
Foo();
cout << "bar";
}
此函数调用函数foo()。如果函数foo尚未在同一个文件中声明或定义,则无法编译此函数。所以声明本身不会产生任何编译代码。他们必须在那里。
如果函数Foo()没有在这个文件中定义,而是一个不同的.cpp文件,那么链接器的工作就是在这两个函数之间建立连接。如果函数Foo()没有在任何地方定义,你将会得到一个链接器错误,而不是编译器错误。
这涉及头文件的概念。头文件是您存储声明的地方。当使用#include包含头文件的内容时,实际发生的情况是预处理器(在实际编译器之前执行的一个步骤)将加载包含的文件并将内容“粘贴”到原始源文件中。所以编译器会看到文件,就好像整个头文件实际上被粘贴到C++文件中一样。
所以,当你在C++编程,你通常会放在.cpp文件的定义,你就会把你的声明.h文件中,另一方面
命名空间是一个简单的方法进行逻辑分组代码。
因此,不,名称空间不存储在单独的文件中,并且它们没有特定的文件扩展名。如果我有一个具有多个名称空间的项目,我可能会为每个名称空间创建一个单独的目录(然后再次,我可能不会,这取决于情况)。
在C++中,#include
用于将文件添加到您的项目,而namespace
是用来保持在逻辑模块的对象(命名空间并不适用于C)
例如,你可能在文件中的向量类“vector.h
”,所以你把它包含在你的项目中。
向量是一个大型图书馆(标准库)STD的一部分,这样你就可以
std::vector
但是由于程序员的懒惰,不想写的std ::遍布访问(标准库有许多非常有用的部分),您可以在文件顶部写上
using namespace std
。这将告诉编译器,每次它看到一个类型(比如向量)时,还要检查命名空间std,因为定义可能在那里。这样,以下声明就变得相当了。
std::vector
vector
在vector.h,你应该看到类似
namespace std
{
class vector { /* Implementation */ }
}
所以#include
是添加文件,而using namespace
是让你的代码更清洁和包装“有意义”的图书馆。编程时你可以省略using namespace
,但绝对需要#include
- 1. prefix namespace variability and xlst
- 2. “using namespace std;”在任何#include之前?
- 3. namespace error'Not a namespace-name'
- 4. Django NameSpace错误
- 5. “End element'jsonCalendarItems'from namespace''expected。Found names'item'from namespace''
- 6. PHP命名空间:\ My \ Namespace或My \ Namespace?
- 7. “boolean and include ..”works but but“boolean and unset($ v)”报告PHP语法错误?
- 8. 为什么我们在使用“using namespace std”时要使用“#include <iostream>”?
- 9. Silverlight XAML namespace scoping
- 10. WPF XAML Namespace import
- 11. SelectSingleNode without namespace
- 12. jaxb unmarshalling with namespace
- 13. Silverlight Usercontrol clr namespace
- 14. WCF:DataContractAttribute和Namespace
- 15. 为什么教条2.2使用-namespace-和-use-而没有任何include或require声明..?
- 16. 用#include“”替换#include“”
- 17. C#:property/field namespace ambiguities
- 18. Global scope vs global namespace
- 19. CXF getNode with namespace,unmarshaling
- 20. Navigate to Class with namespace
- 21. “imports namespace”的工作
- 22. Django中的settings namespace
- 23. xforms“instance namespace”问题
- 24. “using namespace std;”不工作
- 25. Eclipse C++:class,namespace,enumeration not found
- 26. #include
- 27. 编写“:: namespace :: identifier”和“namespace :: identifier”有什么区别?
- 28. Get NameSpace我的测试类
- 29. “using namespace std;” “#包括<foo>” 之前
- 30. boost.spirit x3 move_to and list ast member
C中没有名称空间,只改为C++。 – 2011-02-25 17:37:43