C++ Namespace

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

Namespace  名稱衝突的問題稱為global namespace pollution,而Namespaces讓我們可以較為有效地管理這種「全域命名空間的污染問題」。Library的作者可以利用namespaces機制定義自己的namespace,將library內的符號名稱隱蔽於global namespace之外。例如:

namesapce nfu_csie_library {
  class Math { /*…..*/ };
  long getStudentNumber() { /*…..*/ };
}
每一個使用者自定的namespace都表現出不同的namespace scope。宣告於namespace內的物體我們稱為namespace成員(members)

Namespace的定義
namespace namespace_name {
  /* Member declarations */
  /* Member definitions */
}

Namespace的定義區塊並不一定得連續出現。
「同一個namespace可跨越不同的程式本文檔」
Example:
/* Math.h */
namespace pll_math {
  double cos(double x) { /*…..*/ };
}

/* Math.c */
#include "Math.h"
namespace pll_math {
  double sin(double x) { /* ….. */ };
}

Scope運算子( :: operator)
使用者自定的namespace中的成員,其名稱會被自動冠以namespace名稱做為前導,並加上所謂的scope(::)。另外scope運算子也可以用來表示global namespace的成員
Example:
/* ScopeDemo.cpp */
#include <iostream>

using namespace std;

namespace pll_math{
  const double PI = 3.14159;
}

const double PI = 3.14;
int main(int argc, char **argv)
{
  const double PI = 3.1415;
  cout << PI << endl;
  cout << ::PI << endl;
  cout << pll_math::PI << endl;
  return 0;
}

無具名的Namespaces
/* UnnamedNamespaces.cpp */
#include <iostream>

using namespace std;

namespace{
  int unnamedMember = 13;
}

int main(int argc, char **argv)
{
  cout << unnamedMember << endl;
  return 0;
}

註:此unnamedMember變數只在UnnamedNamespace.cpp檔內可見,也就是它的scope是在本檔案內。

使用Namespace的成員
有三種方式:Namespace AliasesUsing DeclarationsUsing Directives
Example:
/* UsingNamespace.cpp*/
#include <iostream>

using namespace std;

namespace pll_math{
  const double PI = 3.1415928;
  const double MAX = 6;
}

int main(int argc, char **argv)
{
  namespace m = pll_math; // namespace alias
  cout << m::PI << endl;
  using pll_math::PI; // using declaration
  cout << PI << endl;
  using namespace pll_math; // using directive
  cout << MAX << endl;
  return 0;
}

註:using directiveusing declaration要搭配著使用,以免又發生global namespace pollution


標準的Namespace std
C++ standard library
中的所有組件都被宣告並定義於一個namespace std中。像這樣子:
namespace std {
  double cos(x);
  /*……*/
}

只不過它可能會跨越很多個header filesImplementation files

沒有留言: