使用嵌套命名空間時,有時候完全限定名稱最終會變得很長。我知道我可以使用namespace abc = aaa::bbb::ccc
來減少打字量(在某些情況下也可以提高可讀性)。用於在C++中重命名命名空間的一致方法
但是,我不確定在項目中的所有文件中實現這種重命名的最佳方式是什麼。直接的方法(即以每次使用的方式重命名長名稱空間)可能會導致最終在不同文件中爲同一完全限定名稱使用不同的短名稱。所以,我想要想出一個更一致的方式來做到這一點。
舉例來說,假設是這樣的:
project
|- client
| |- core
| |- plugin
| |- util
|- server
...
我想創建每個目錄一個頭,包括減少的名字。例如,project/client/core/core.h
將包含namespace pr_cl_core = project::client::core
(我知道這個短名稱的例子很差,但在真實的項目中他們更有意義)。然後,我會將core.h
包含到project/client/core
中的所有頭文件中,以便當包含該目錄中的標頭時,比如project/client/plugin/plugin_foo.h
,短名稱空間版本即可用。
這是一個很好的方法嗎?還有其他更好的方法嗎?
我發現了幾個關於SO的C++命名空間的問題(例如,1和2),但它們都不涉及如何以項目範圍的方式解決名稱空間重命名問題。
編輯:此外,這樣的機制可以用來系統地重命名整個項目的長命名空間(如Boost的)。舉例來說,我通常會重命名一些名字空間,如:
namespace ip = boost::asio::ip;
namespace ptime = boost::posix_time;
目前,我這樣做是對每個翻譯單元的基礎上,但我想用整個項目的全局的方法來做到這一點。
你可以這樣做,或者你可以讓它變得更簡單:在頂層有一個聲明所有命名空間和別名的原型的頭文件。然後將其包含在分區中。 – Linuxios 2012-07-05 15:55:35
@Linuxios我也在想這樣的事情,但最終可能會引入很多依賴項:如果我更改了全局文件,幾乎項目中的所有文件都需要重新編譯。話雖如此,如果命名空間的結構沒有太多變化,它不應該是一個主要問題。 – betabandido 2012-07-05 15:59:05
@betabendido:啊。那麼快速和骯髒的解決方案呢?預處理器宏!只需在每個文件中聲明它們的別名即可。這樣,每個文件都可以擁有自己的別名。是的,人們會爲重複的代碼大喊大叫,但是你總是可以添加一個編譯時間腳本來爲你做... – Linuxios 2012-07-05 16:01:38