当前位置:首页 » 文件管理 » 头文件可以放命名空间吗
扩展阅读
哪个软件可以p假发 2025-07-24 01:48:35
什么软件可以整蛊照片 2025-07-24 01:47:54

头文件可以放命名空间吗

发布时间: 2023-05-14 23:27:52

Ⅰ c++命名空间在哪里定义源文件还是头文件定义了怎么调用std是默认系统命名空间吗

都可以,不用调用,如果在源文件里定义棚耐卜了,当前cpp就能够亩拿使用该命名空间的方法
如果在头文件定义,比如在header.h里面写了using namespace std;
那么在cpp里#include"header.h"同链穗样可以使用其中的方法

并不是默认的,如果没有using namespace std这句话
那么在cin、cout等就要写成std::cin>>
std::cout<<
这样,如果写了那句话,就可以直接cin>>和cout<<

Ⅱ c++ 关于命名空间,头文件里面有一个相当于声明的名称空间,而代码文件又定义一个相同的名称空间

命名空间的主要作用是限制重名,即在不同的命名空间中可以使用相同的名字。

例如上海可以有【中山路】,北京也可以有【中山路】,广州也可以有【中山路】。

虽然大家的路名都是【中山路】。但是只要提供了命名空间--城市名,就可以将这几条路区分开来。

在头文件中,我们需要使用命名空间对函数进行限定。

//test.h
namespacetest{
voidfunc();
}

在代码文件中,虽然我们引用了磨蔽test.h,但是如果不在func也放在同样命名空态仔间中,就会导致编译器认为这是两个函数。

//test.cpp
#include"test.h"
namespacetest{
voidfunc()
{
//TODO
}
}

voidfunc()//←这是一瞎闭州个全局的func,和test命名空间中的func是两个函数。
{
//TODO
}

Ⅲ C++中,头文件与命名空间的关系

分类: 电脑/网络 >> 程序设计 >> 其他编程语言
问题描述:

有些书说有些头文件不在std里是什么意思?std里包含些什么?为什么不用std就不能使用cout?头文件中声明的东西为什么在使用的时候需要先using namespace std;一下?

解析:

######################################

有些书说有些头文件不在std里是什么意思?

######################################

那些书那样说会造成困惑,因为名字空间,就像函数、

结构、类等等,是用代码来表达的一种语言机制。

std(standard的缩写)是标准C++里必须存在的一个

名字空间的名字。所有实现标准C++的编译器都

必须确保这空间的存在。

名字空间声明是这样表达的:

namespace x {

创建新名字

}

x是该名字空间的名字。

头文件装代码,代码表达名字空间。

所以应该说“有些头文件的内容不在std里”。

具体的意思就是,在那些头文件里,

没有任何代码是在“namespace std { }”的括号里的。

######################################

std里包含些什么?

######################################

std里包含标准C++库里的所有名字(类名、

函数名、...)。

######################################

为什么不用std就不能使用cout?

######################################

不是不能使用,只是不能直接写cout,必需用空间名和

名字空间限制符作为前缀,写成std::cout。

用某个名字做名字空间声明的时候,若已有同名的

名字空间存在,就是仅仅把括号里的名字加进去,

否则先创建空间,后加入括号里的名字。

加入名字空间后的名字都是对全局空间隐藏的,

但该名字空间的名字却不隐藏(除非该空间在另一个

名字空间里)。

cout隐藏在std里,但std本身不隐藏,所以

你“#include<iostream>”了之后,不必做

使用声明便可直接用std,通过它访问cout。

若你做了使用声明,对该使用声明所处的作用域的隐藏便

被抵消(作用域的开端到声明之间的那段除外),

即不必使用空间名和名字空间限制符作为前缀。

######################################

头文件中声明的东西为什么在使用的时候需要

先using namespace std;一下?

######################################

你已经知道做使用声明是要讨个方便而不是一种必要。

我们作个总结性的复习吧。

(A)这简单的程序里只有全局和局部空间,没有其它的名字空间:

void main( ) {

std::cout << ""; 错误:std不存在。

cout << ""; 错误:std不存在cout就不用提了。

}

(B)这个则多了一个叫std的名字空间。std这名字也可见了:

#include<iostream>

void main( ) {

std::cout << ""; OK:可通过std骚扰cout。

cout << ""; 错误:cout仍然被包在std里面,不可见。

}

iostream头文件里有std的声明。在编译闹州搜之前,

预处理器会用iostream里的全部内容来代替

“#include<iostream>”这个预处理器指示符。

效果是,这程序包含iostream里的所有代码。

include是包含的意思。

包含指示是在全局空间里,所以在指示之后的任何地方,

std这个名字是可见、可访问的。

(C)这个不包含声迹册明std的代码却尝试打液历开std包,

落了个跟(A)一样狼狈的下场:

using namespace std;

void main( ) {

std::cout << ""; 错误:std不存在。

cout << ""; 错误:std不存在cout就不用提了。

}

(D)这个声明了std(曝露了std)并把std打开,

让里面的名字(cin、cout、cerr、...)跟

std一样暴露。

[相信你闭上眼都能写出这段代码了]

Ⅳ c++命名空间的问题

  • 你没有理解C++的namespace。如果你熟悉java的话,你可以这样理解,java中用包机制取代了所谓的命名空间。在java中一般是一个类一个文件的(原则上说多个类放一个文件下也没问题),然后相同功能的一组类文件组合成了一个包。

    在C++中,namespace就相当于java中的包,单纯的头文件是不需要命名空间的,如果你想把多个类、辅助函数等等组合成一个整体,就用namespace。

  • 命名空间是防止名称碰撞的机制,比如我有一个class A,你也有一个class A,那么我们在同一个程序下的话到底是用你的A还是我的A?在C++中就这样用I::A、Y::A,而java中则是I.A,Y.A

  • 不需要.h的头文件,是C++的标准头文件,里面都包含了namespace std,如果是标准出现前的C++头文件,如<iostream.h>这些都不包含namespace,那个时候还没这个概念。新的头文件是标准出现后重写的,防止命名碰撞问题(VC++6.0是标准之前的编译器,允许使用旧版的头文件,但这些都不包含namespace,而新编译器都不再使用带.h的C++标准头文件)如果是C的头文件,如<stdio.h>就不包含namespace,C++重写的C的头文件都包含std,名称为<cXXX>,如<cstdio>

  • 至于谁包涵谁的问题就很难说清楚了,因为namespace虽然一般都是用在头文件中的(规范使用是在头文件中),但是一个头文件不一定需要namespace,而且一个namespace可以包涵多个不同头文件。我举个例子:

//file1.h
namespaceA{
classB{};
}
//file2.h
namespaceA{
classC{};
}
//classB、C都属于一个namespaceA中,但却分属于不同的头文件


  • 你最后提到mport相当于include,你可以这样认为,但又有不同。首先从2者的实现机制来看,import是引入一个包或者引入包下的某个类文件,include只引入头文件(java中没有头文件,所以是实现和声明一起引入的,C++中实现和头文件是拆开的,include只包含声明部分,实现是由链接器让核隐最后链接组成的)

    其次 java中的 import 既包含了包的引入,又开放了包的命名。比如import java.swing.*; 你用JFrame类时就不用写javax.swing.Frame了,只要写JFrame;但C++中include只包含了声明的引入,要想开放命名空间需要using指令,如using namespace std 或using std::cout,然后就能直接写 cout了,否则每次都要写std::cout

  • 至于你说的std::相当于System.out.,是完全不对的。因为System是属于java.lang这个包下的一个类,而out是类下的一个成员对象。java.lang.才相当于std::

    而cout和print()是有本质区别的,这个你可以看下《C++ primer》或者《C++程序设计语言(十周年纪念版)》(这2本书都对namespace有清楚的解释,建议看一下),我简单解释下吧,以下是简化版本的cout实现:

namespacestd{
……
classostream{
……
ostream&operator<<氏颂(ostream&,conststring&);
……
}
……
ostreamcout;
}

简单来说cout已经是一个实例化的对象了,相当于System类下的out,而<<才是他的方法(操作符重载),相当于print()。

简单来说 std::cout<<" ";相当于java.lang.System.out.print(“ ”);

(如果要完全等价的话,要把cout 放入classostream中作为成员,就变成std::ostream::cout<<" ";)


  • 至于std,就是一个标准库。你可以认为是相同功能的类组成一个namespace,坦厅但对于一个库来说按功能细分成小的namespace是不合理的,使用相当不便,所以一个库就使用一个namespace,表示属于这个库的集合,和其他不同的库进行区分,比如boost库就用boost做namespace,C++大部分库都有自己的命名空间,可以去了解下。

    如果是自己编程,就可以按功能定义一个namespace,比如一个Data的namespace,里面可以放Year、Month、Data类等,还有一些辅助函数等等。不必像库一样把功能不同的类也放到一起,然后统一用一个namespace。