C++;名称空间和包含 为什么我们需要使用代码空间 >代码> > C++程序中的< /COD>指令?< /P>

C++;名称空间和包含 为什么我们需要使用代码空间 >代码> > C++程序中的< /COD>指令?< /P>,c++,namespaces,header-files,C++,Namespaces,Header Files,比如说, #include <iostream> using namespace std; int main() { cout << "Hello world"; } #包括 使用名称空间std; int main(){ cout在C++中,概念是分开的。这是经过设计的,非常有用 您可以包含一些没有名称空间可能会模棱两可的内容 使用名称空间,您可以引用具有相同名称的两个不同类。当然,在这种情况下,您不会使用using指令,或者如果使用了,则必须在名称空间中指定其他

比如说,

#include <iostream>

using namespace std;

int main() {
 cout << "Hello world";
}
#包括
使用名称空间std;
int main(){

cout在
C++
中,概念是分开的。这是经过设计的,非常有用

您可以包含一些没有名称空间可能会模棱两可的内容

使用名称空间,您可以引用具有相同名称的两个不同类。当然,在这种情况下,您不会使用
using
指令,或者如果使用了,则必须在名称空间中指定其他内容的名称空间

注意,您不需要使用-您可以只使用STD::CUT或任何需要访问的。您用名称空间序列化项目。

< P> C++ >代码>包含< /代码>和<代码>使用具有不同的功能。
#include
将包含文件的文本放入源文件中(实际上),另一方面,名称空间只是一种具有唯一名称的机制,以便不同的人可以创建“foo”对象

这是来自C++的没有模块的概念。< /P>

记住C++中的命名空间是开放的,这意味着不同的文件可以定义同一命名空间的不同部分(类似于.NET的部分类)。


include定义了函数的存在性

使用的目的是使它们更容易使用

iostream中定义的
cout
实际上被命名为“std::cout”

您可以通过编写来避免使用名称空间

std::cout << "Hello World";
std::cout如果你想真正理解这一点,你需要理解

使用
include
只需包含头文件

使用
usingnamespace
可以声明您正在使用包含cout之类内容的给定名称空间。因此,如果您这样做:

using namespace std;
要使用
cout
您只需

cout << "Namespaces are good Fun";

cout这些关键字用于不同的目的

using关键字使命名空间中的名称可在当前声明性区域中使用。这主要是为了方便起见,这样您就不必一直使用完全限定的名称。这对它进行了详细的解释


#include语句是一个预处理器指令,它告诉预处理器处理指定文件的内容,就像这些内容在指令出现时出现在源程序中一样。也就是说,您可以将此语句视为将包含的文件复制到当前文件中。然后编译器编译eNyTrE文件,就像你在一个大文件中写的所有代码一样。

< P>我认为其他答案略微漏掉了。在所有C++、java和C语言中,<>代码>使用<代码> >代码>导入< /COD> >完全是可选的。所以没有区别。

然后,您必须做一些其他事情,使代码在所有三个平台中都可见

<>在C++中,您必须将它包含到当前的翻译单元中(对于向量、字符串等的许多实现来说,已经足够好),通常您还需要在链接器中添加一些东西,尽管有些库基于包含的内容自动执行(例如,在Windows上建立Boost)。 在C#中,您必须添加对另一个程序集的引用。这需要处理相当于包含和链接设置的问题

在Java中,您必须确保代码位于类路径上,例如,向其中添加相关的jar


因此,在所有三个平台上都需要非常相似的东西,使用
/
导入
(方便)和实际链接解析(要求)之间的分离这三种指令都是相同的。

使用指令和包含预处理器指令是两件不同的事情。
include
大致对应于Java的
CLASSPATH
环境变量,或者Java虚拟机的
-cp
选项

它的作用是让编译器知道类型。例如,只需包含
,您就可以引用
std::string

#include <string>
#include <iostream>

int main() {
    std::cout << std::string("hello, i'm a string");
}

使用头文件中的使用指令是不好的做法,因为这意味着除了包含在它之外的其他源文件都会使用不合格名称查找来查看这些名称。与Java不同,在java中,只有导入包可见的名称出现在C++中,如果包含文件DIAL,则会影响整个程序。间接地或间接地

在全局范围内执行时要小心,即使在实现文件中也是如此。最好尽可能在本地使用它们。对于命名空间std,我从不使用它。我和其他许多人总是在名称前面写
std::
。但是如果您碰巧这样做,请按如下方式执行:

#include <string>
#include <iostream>

int main() {
    using namespace std;
    cout << string("hello, i'm a string");
}
namespace std {
    template <class T, class Allocator = allocator<T> > class vector;
    ...
} 
#包括
#包括
int main(){
使用名称空间std;

CUT< P>指出,C++和Java是不同的语言,做的事情有些不同。此外,C++更像是一种“java语言”,而java更像是一种设计语言。
虽然
使用namespace std;
不一定是个坏主意,但将其用于所有名称空间将消除所有好处。名称空间的存在使您可以编写模块而不必考虑与其他模块的名称冲突,并且
使用此名称空间;使用此名称空间;
可能会产生歧义。

甚至Stroustrup也会引用对于
#来说,包含
机制有些粗糙。但是它确实使单独编译变得更容易(提供编译过的库和头,而不是所有源代码)

问题是,“为什么C++在它已经有了<代码>之后包括< /代码>机制——添加命名空间?”

关于为什么
#include
不够,我所知道的最好的例子来自Sun。显然,Sun开发人员在他们的一个产品上遇到了一些问题,因为他们编写了一个
mktemp()
函数,该函数恰好与
mktemp()具有相同的签名
#include <string> // CLASSPATH, or -cp
#include <iostream>

// without import in java you would have to type java.lang.String . 
// note it happens that java has a special rule to import java.lang.* 
// automatically. but that doesn't happen for other packages 
// (java.net for example). But for simplicity, i'm just using java.lang here.
using std::string; // import java.lang.String; 
using namespace std; // import java.lang.*;

int main() {
    cout << string("hello, i'm a string");
}
#include <string>
#include <iostream>

int main() {
    using namespace std;
    cout << string("hello, i'm a string");
}
namespace std {
    template <class T, class Allocator = allocator<T> > class vector;
    ...
} 
namespace std {
    template <class T, class Allocator = allocator<T> > class vector;
    ...
}
int main(){
   /*you want to use vector here*/
}