當前位置:首頁 » 文件管理 » 頭文件可以放命名空間嗎
擴展閱讀
小電筒怎樣用在桌面 2025-07-24 08:15:52
投標文件可以加字嗎 2025-07-24 08:10:43

頭文件可以放命名空間嗎

發布時間: 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。