- 論壇徽章:
- 2
|
本帖最后由 OwnWaterloo 于 2015-11-18 19:40 編輯
回復(fù) 4# windoze
目前還好。。。 反正是寫測試時(shí)碰到的。。。 即使繞不過去大不了不測了
大概情況是這樣。。。
1. 有幾個(gè)宏。。。
MODULE_NS
MODULE_NS_ENTER
MODULE_NS_LEAVE
如果MODULE_NS沒有定義就有一個(gè)默認(rèn)值
2. 后續(xù)代碼在合適的地方會(huì)用這些宏
MODULE_NS_ENTER
... // 這里面定義的一些宏,因?yàn)椴恢浪鼈儠?huì)在何處展開,所以會(huì)使用 MODULE_NS::detail::some_thing 之類的
MODULE_NS_LEAVE
如果對默認(rèn)放的名字空間不滿意, 就在包含module.hpp前定義這幾個(gè)宏,把內(nèi)容放到別的名字空間里去。
3. 測試使用這幾個(gè)宏
本來應(yīng)該是分幾個(gè)cpp單獨(dú)測的。
- // test_ns_global.cpp
- #define MODULE_NS
- #define MODULE_NS_ENTER
- #define MODULE_NS_LEAVE
- #include "module.hpp"
復(fù)制代碼
- // test_ns.cpp
- #define MODULE_NS ::ns
- #define MODULE_NS_ENTER namespace ns {
- #define MODULE_NS_LEAVE }
- #include "module.hpp"
復(fù)制代碼
- // test_ns_nested.cpp
- #define MODULE_NS ::ns::util
- #define MODULE_NS_ENTER namespace ns { namespace util {
- #define MODULE_NS_LEAVE } }
- #include "module.hpp"
復(fù)制代碼 test_ns_global.cpp, test_ns.cpp, test_ns_nested.cpp 里面顯然還要包含一個(gè)真正寫測試的文件, 不然重復(fù)寫這么多次不科學(xué)。
我覺得這樣文件太多很煩。。。 就都放在一個(gè)test_ns.cpp里了。
- // test_ns.cpp
- #ifndef ONLEAVE_TEST_NS_NAME
- #include <assert.h>
- #include <typeinfo>
- // include ...
- // 包含自己3次。。。
- #define MODULE_NS
- #define MODULE_NS_ENTER
- #define MODULE_NS_LEAVE
- #define MODULE_TEST_NS_NAME global
- #include "test_ns.cpp"
- #define MODULE_NS ::ns
- #define MODULE_NS_ENTER namespace ns {
- #define MODULE_NS_LEAVE }
- #define MODULE_TEST_NS_NAME ns
- #include "test_ns.cpp"
- #define MODULE_NS ::ns::util
- #define MODULE_NS_ENTER namespace ns { namespace util {
- #define MODULE_NS_LEAVE } }
- #define MODULE_TEST_NS_NAME nested
- #include "test_ns.cpp"
- int main() {}
- #else /* defined(MODULE_TEST_NS_NAME)*/
- // 實(shí)際測試用的代碼
- #endif
復(fù)制代碼 然后就中招了。。。
如果gcc不報(bào)錯(cuò),但選錯(cuò)了名字空間的話, 測試應(yīng)該全都能通過(畢竟所有名字空間里的功能都是一樣的。。。)。。。
但有測試?yán)锩嬗休敵鰐ypeid(x).name(), 所以仔細(xì)看還是能看出來。。。 |
|