簡體   English   中英

命名空間和C ++

[英]Namespaces and C++

我觀察到,在C ++中,很少使用命名空間,而在.Net中它很常見。 這有什么特別的原因嗎?

另外我想知道其他人是否看到過在C ++中常用的命名空間。

編輯:其實我指的是自定義應用程序而不是標准庫,如STL或任何其他東西。

在C ++中,名稱空間在初始實現后的某個時間被添加到語言中,因此有許多應用程序代碼沒有使用它們。 因此,由於它們的后期添加,所有標准庫都被放入一個命名空間中。 因此使用簡單的using namespace std; 如果你願意,你幾乎可以忽略命名空間。

另一方面,在C#中,名稱空間從一開始就涉及到,並且庫被大量分配。 此外,每個人都使用它來創建初始代碼,默認情況下將類放入命名空間。 這迫使人們更加了解命名空間。

C ++中的命名空間完全不同於.Net,ActionScript和Java(它們具有相同的概念)。 它們根本不是同一個概念。

在C ++中,命名空間主要用於允許在命名上下文(命名空間)中封裝多個類型和函數。 它只涉及命名和訪問名稱。

在.Net,ActionScript和Java中,名稱空間更多地是關於模塊而不是名稱。 它們強制開發人員將他的代碼組織在不同的命名空間中,每個命名空間都有一個目的,即上下文。 由於這些語言是動態的(而不是像C ++那樣的靜態),名稱空間允許將類型后期綁定到代碼,因此您只需要在文件中使用要使用的類型的規范名稱(名稱空間+名稱),從而快速編譯。

在C ++中,沒有模塊comcept,只有完全不了解彼此的編譯單元。

現在關於它們的使用,通常很好的做法是在C ++中使用命名空間來封裝模塊(可執行文件或dll / so),一些實現代碼或任何有用的代碼子部分。 這說大多數時候最好沒有太深的命名空間層次結構。 由於歷史原因,很多C ++開發人員在很長一段時間內都不知道C ++有一個名為namespace的功能。 現在我們所謂的“現代C ++”表明你已經了解它,但是今天仍然使用了許多舊的C ++代碼,也許這就是你在談論命名空間時所看到的。

C ++中的命名空間是一個與其他語言不同的特性,這也使得它在代碼中的寫作方式或多或少。 事實上,它是如此不同,你根本不會以同樣的方式管理它,當你來自.Net時,代碼真的很難理解。 因此,您不應該在語言之間以相同的方式使用名稱空間,它們實際上是不同的概念。

我觀察到在C ++命名空間中很少使用

您是否能夠通過相關的經驗來支持這一點? BoostQt ,STL,...都使用命名空間。

最簡單的答案是,當您在Visual Studio(2003及更高版本)中啟動程序時,默認情況下會創建namespaces 我想其他(較舊的)IDE沒有。

.NET從一開始就鼓勵它。 命名空間並不總是C ++中原始實現的一部分。 它已經獲得了.Net的吸引力。

從我在5個不同的地方工作,我可以說在我加入之前,5個使用過的命名空間中有2個。

我猜C ++中的命名空間沒有得到那么多的使用(因為它們應該?)是由於語法是cludgy。

即:我想寫這個:

namespace xml::xmpp::core { }

但是必須寫下這個:

namespace xml { namespace xmpp { namespace core { } } }

要轉發聲明,我想寫:

class xml::parser;

但必須寫

namespace xml { class parser; }

但我可以寫:

using namespace xml::xmpp::core;

在一個稍微不同的說明,任何人都可以告訴我為什么類必須由分號終止,但其他任何東西(函數,命名空間)不?

命名空間是大項目中最好的朋友

看得與否 - 無所謂。 養成使用它們的習慣。

隨着時間的推移,我看到越來越多的c ++代碼巧妙地使用命名空間。 你可能一直在觀察c-with-classes編程風格的揮之不去的影響......

請注意,我是一名物理學家,我看到的大部分代碼都是由其他物理學家編寫的,所以這可能是我的領域的一件神器。

一個原因是一些流行的編譯器(特別是gcc)很晚才添加對命名空間的支持,並且為了更加可移植,許多項目在沒有命名空間的情況下啟動。 當然,對於不使用命名空間的新項目會很奇怪。

Boost C ++庫廣泛使用命名空間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM