2016-04-03 121 views
0

例如,假設我有一個宏觀有沒有辦法斷言當前的命名空間?

#define DEFINE_VAL(x) int x 

我想斷言宏只在某些命名空間中使用,是有辦法做到這一點?

在另一個詞,我想是這樣的:

#define DEFINE_VAL(x) static_assert(CurrentNamespaceIsXYZ); int x 

或者

#define DEFINE_VAL(x) ASSERT_CURRENT_NAMESPACE_IS(XYZ); int x 

如何實現/定義CurrentNamespaceIsXYZ或ASSERT_CURRENT_NAMESPACE_IS?

+0

簡短的回答是:沒有。預處理階段通常發生在編譯階段之前,在編譯階段中,名稱空間和其他語言結構實際上被解析。也許你現在可以解釋[你真正的XY問題是什麼](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)? –

+0

您可以#undefine符號在輸入到任何地方不需要的地方。這可能是很多工作。不要使用宏。 –

+0

我修改了這個問題,你能再看一次嗎?謝謝! –

回答

0

當然。只要檢查一個非限定類型是否與限定類型是同一類型。

#DEFINE_VAL(x)     \ 
    struct TEST;     \ 
    static_assert(std::is_same<TEST, ::CurrentNamespaceIsXYZ::TEST>::value, \ 
       "Not in XYZ); \ 
    int x 

可能是最好的後綴GUID來TEST,提供名稱衝突。

相關問題