2011-03-01 157 views
1

我正在編寫由幾個「包」組成的實用程序庫。每個包中的類都包含在各種名稱空間中。我對如何通過在類聲明結尾自動聲明使用聲明來簡化情況有所瞭解(參見下文),這將避免程序員在cpp文件中執行它。聲明命名空間聲明後使用語句

namespace Utility 
{ 
    class String 
    { 
     // Class Implementation 
    }; 
} 

using Utility::String; 

我的理解是,如果用戶包括頭STRING.H和字符串在公用那麼程序員將要使用的字符串。顯然這可能是壞的,如果有外部類鏈包括一堆文件弄髒名稱空間,所以我認爲如何使它成爲#define代替。

namespace Utility 
{ 
    class String 
    { 
     // Class Implementation 
    }; 
} 

#ifdef AUTO_DECLARE_NAMESPACE 
    using Utility::String; 
#endif 

這樣,想要這個擴展功能的程序員可以得到它。

這是一個好主意還是有我忽略的東西?

回答

6

如果您只是要爲名稱空間中聲明的每個名稱添加使用聲明,則使用名稱空間沒有意義。

讓頭文件的用戶決定他們想要如何使用頭文件。如果有人想使用使用聲明,請讓他直接在.cpp文件中執行;這將使該.cpp文件中的代碼更清晰,因爲它將顯而易見名稱的起源。

0

老實說,我相信這就是using namespace指令的目的。考慮到using namespace指令就是這樣做的,您不需要添加此預處理器機制。

2

這似乎是最好的毫無意義,最壞的是惱人的。

讓開發人員決定使用哪些命名空間以及完全限定條件有什麼問題?

0

難道你沒有另一個.h文件,所有使用像my_lib_import_names.h只是#include,以得到你想要的?

你可能有類沒有被聲明的問題,但你很可能使用類似繞過它:

#ifdef UTILITY_STRING_H_ 
    using Utility::String; 
#endif 
.. 
#ifdef UTILITY_SOMETHING_ELSE_H 
    using Utility::SomethingElse; 
#endif 

..

你覺得呢?

通過這種方式,您可以在庫中保留「預期」行爲,但也可以按自己喜歡的方式進行操作。您還可以在類上保留命名空間的好處(以維護新的.h文件爲代價)。