2011-01-28 100 views
4

是不是正確的方式在命名空間中的功能,我將在多個文件#包括?多重定義和命名空間

test.h

#pragma once 
    #ifndef TEST 
    #define TEST 
    namespace test{ 
    namespace { 

     bool test(){ 
      return true; 
     } 
    } 
} 
#endif //TEST 

回答

8

包含後衛名稱TEST可能與其他一些宏發生衝突,請使用更詳細的內容,如HEADERNAME_H

注:名稱以下劃線後跟大寫字母開始,包含兩個連續的下劃線的名字,被保留用於執行。其次,如果你打算把它放在頭文件中,那麼函數的定義必須是inline。否則,如果包含在多個翻譯單元中,則會出現多重定義鏈接程序錯誤。或者更正式,標準的ODR(一個定義規則),禁止這樣的多個定義,除非他們都inline和有效地相同。

編輯:刪除上面,因爲我沒有看到你的匿名命名空間的使用。

相反匿名命名空間,它給你在每個轉換單元和一個獨立的(相同的)函數在每個這樣的命名空間定義一個單獨的名稱空間的,而不是隻是使用inline –如上述刪除線出文本進行說明。

乾杯&心連心,

+0

感謝意見 – Stals 2011-01-28 11:36:01

0

是。因爲它給你一個能夠命名相同名稱並且名稱相同的名字並且保持這個名字簡單

2

匿名命名空間讓所有標識符他們包裹獨特的翻譯單元他們在。把一個匿名的命名空間到會(早晚)被包含在一個頭不同轉換單元將導致在該匿名命名空間中定義的所有標識符在每個轉換單元分開(但相同)是。

我還沒有看到一個希望這個用例。