中央論壇 - CENTER BBS

標題: C++ 的 namespace 機制 [打印本頁]

作者: f66666602    時間: 2007-9-4 09:04
標題: C++ 的 namespace 機制
C++ 的 namespace

寫程式時,很可能因為發展的程式碼,逐漸冗長,不小心就會用到同樣的名稱,C++ 對於
此問題,發展了 namespace 的機制。變數、資料、函式如果放在不同的 namespace 就不
會衝突,如:

當 include A.h 和 B.h 時,用 A::xxx 表示 A.h 裡面的 xxx,
                而用 B::xxx 表示 B.h 裡面的 xxx。
而兩者就必須以 A::xxx 和 B::xxx,作存取。

A.h:
──
  namespace XXX {
  void A()
  ...
  }

B.h
──
  namespace XXX {
  void B()
  ...
  }

它們就分別是 XXX::A() 和 XXX::B()

其實可以直接把 namespace 想成在 name 前面加上另一個 name,來避免衝突。

如果覺得每次要用某個 namespace 裡面的東西就要打 XXX::yyy 很麻煩,可以用

using namespace XXX;

宣告,則以上行敘述宣告之程式檔,就可直接引用 namespace 下的變數、資料、函式。

另外,還有一種 namespace,稱為 anonymous namespace,可取代以前的 global static
functions/variables,如:

A.cpp:
───
  namespace { // 不加上名字
  int xxx;
  }

那這個 xxx 就只能在 A.cpp 裡面使用。

較特別的,Standard C++ Library 裡面所有的東西都是放在 std 這個 namespace 裡,
所以用 cout 時就用 std::cout。但,我們平常在用 cout 時都沒有打 std::cout,也沒
有用「using namespace std;」,這樣為什麼不會有問題呢?

因為舊的 C++ library 並沒有把 cout 放在 namespace std 裡面,故可直接使用。

新的 Standard C++ Library 就會放在 std 裡 (請見 1998 年通過的 C++ Standard),
但為和舊的程式相容,所以新的 C++ library 的 header file 檔名不同,如:

在舊的 C++ library 裡面,cout 宣告在 iostream.h 裡面
但在新的 library 則是宣告在 iostream 裡面

也就是說:

#include <iostream.h>

會 include 舊的 header 檔,而

#include <iostream>

會 include 新的 header 檔




歡迎光臨 中央論壇 - CENTER BBS (https://www.centerbbs.com/) Powered by Discuz! X3