C++ : namespace (1)


Posted by Kled on 2021-12-10

每次在用using namespace std;都不知道意義為何, 最近重新開始看C++, 來看看幾乎每個程式開頭都會使用的程式碼

C++ Standard Template Library (STL)

命名空間

在大型協作的程式碼中, 為了避免混淆的同名問題(例如在a.cpp有Basic的class, b.cpp也有叫Basic的class), 這時候使用namespace就可以避免這個問題的發生

可以看一下下面的例子

namespace first_space{
   void func(){
      cout << "Inside first_space" << endl;
   }
}
// 第二個命名空間
namespace second_space{
   void func(){
      cout << "Inside second_space" << endl;
   }
}
int main ()
{

   // 調用第一個命名空間中的函數
   first_space::func();

   // 調用第二個命名空間中的函數
   second_space::func(); 

   return 0;
}

可以看到在不同的namespace下有同樣的func, 有不同的意義, 所以這時候我們會在func外面包上一層namespace, 等於限制其使用範圍, 避免compiler混淆, 使用方式是在前面加上namespace前綴以及::

這點跟class實體定義function的時候很像

所以using namespace std的std就是一種命名空間, 用來定義STL裡面的函示與變數以及類別, 如果不使用using namespace std, 就必須在每個function前面加上std::, 像是

#include <iostream>

int main()
{
    std::cout << "Hello World!\n";
}

我們會在C++程式開頭看到, 總是會使用基本函式庫, 透過using namespace可以節省每次key 前綴的功夫, 所以我們應該濫用using namespace嗎?

using namespace 使用時機

其實這樣反而會違背了設計namespace的初衷, 因為使用namespace就是為了防止衝突用的, 如果一昧的為了方便使用namespace, 就會導致命名又發生衝突, 所以一般來說如果連std裡面的函式都不常使用到, 建議還是加上前綴的方式使用該命名空間的物件是比較符合namespace的設計

如果只使用到該namespace某些function, 甚至可以直接using該function, 而不是把整個命名空間都using

using std::count;
count << "Hello, World!" << endl;

使用namespace當作別名縮短

假設某個命名空間很長, 我們可以透過 namespace 別名 = 空間名
例如下面的方式, 就可以縮短命名空間, 有點類似於python的import pandas as pd

namespace my_interface_space
{
    namespace abc = a_big_namespace;

    struct MyClass
    {
       void fn(abc::testType tt) {
          abc::test(tt);
       }
    };
}
namespcae a = my_interface_space;

如果喜歡文章, 不妨按下喜歡訂閱支持

如果真的想支持我進行創作與實踐計畫, 也可以進行打賞
BTC (BTC) : 1LFRBqvWR9GGizBzoFddkb5xRpAzKRVoDC
BTC (BSC) : 0xe1cda3eb778d1751af17feac796a4bbe4dbca815
BTC (ERC20) : 0xe1cda3eb778d1751af17feac796a4bbe4dbca815
USDT (TRC20) : TT7wgKuYoHwfRy3vCr38Qy3gnS3JJ1aKvn

如果想使用幣安, 可以使用我的推薦連結可以節省手續費10%
或使用推薦碼 : A5YRMD2T


#cpp #C++ #C #C語言 #程式語言 #namespace #std #stl #program language







Related Posts

[Alpha Camp] 學期2-1 回顧

[Alpha Camp] 學期2-1 回顧

[進階 js 02]  賦值

[進階 js 02] 賦值

第一個Go的測試

第一個Go的測試


Comments