[英]Enum declaration inside a scope that is a parameter of a macro
我正在嘗試創建一個將范圍作為參數的宏。
我知道,這可能不是一件好事,等等。
我正在嘗試這樣做,並遇到了預處理器尋找逗號和括號的問題...問題在於枚舉。
如何在作為宏參數的作用域內聲明一個枚舉?
當編譯器看到枚舉之間的逗號時,會將其視為分隔符。
如果您想知道為什么要輸入它,是因為我需要注冊我的命名空間和類,對於命名空間和類,我需要知道它們何時關閉,因此我正在考慮創建一個宏,該宏最初會調用注冊的靜態函數命名空間,封裝其內容,最后調用一個靜態函數,該函數從注冊表中刪除該命名空間。
使用宏,編碼人員可以更輕松地執行此操作,並確保他不會忘記刪除括號末尾的名稱空間。
謝謝,
喬
編輯:
我想要一個接受范圍作為參數的宏:
#define MYMACRO(unkownscope) unknownscope
class MYMACRO({
// please, don't take this code seriously, it is just an example so you can understand my question
});
現在,如果我嘗試:
#define MYMACRO(unkownscope) unknownscope
class MYMACRO({
enum {
anything = 1,
everything = 2
};
});
由於枚舉內的逗號,它不會編譯,因為編譯器認為它是宏的分隔符。 括號內的逗號不會發生這種情況,例如:
int a(){
int x = anyfunction(1, 2);
}
會正常編譯,因為逗號在雙括號內。
對不起,我無法早點解釋...我的英語水平不是很好,而且這些單詞一直讓我不高興= [
泰為答案!
喬
聽起來您正在將預處理器推到它想去的地方。 盡管它並不那么優雅,但如何將宏分成兩個(一個在前和一個在后),然后傳遞“作用域”作為參數,您可以將宏與前后宏一起包圍在范圍內。
因此,如果您的宏看起來像這樣:
SOMACRO({ ... });
您將改為執行以下操作:
PRESOMACRO();
{ ... };
POSTSOMACRO();
#define SCOPED_STUFF(pre,post) pre; STUFF; post;
#define STUFF enum {a,b,c}
SCOPED_STUFF(a,b)
#undef STUFF
#define STUFF enum {q,r}
SCOPED_STUFF(c,d)
#undef STUFF
您正在嘗試使用宏復制RAII。
#define SCOPE(ns) NamespaceRegistrar _ns_rar(ns);
struct NamespaceRegistrar {
std::string _ns;
NamespaceRegistrar(const std::string& ns) : _ns(ns) { AcquireResource(_ns); }
~NamespaceRegistrar() { ReleaseResource(_ns); }
};
{
SCOPE("Foo")
// stuff
}
我不知道您在談論枚舉。
您已經注意到了問題所在,在boostpro.com上的一篇文章總結了問題所在。
有解決方法,但是我會去利用Boost.Preprocessor 。
在不完全知道您要通過語法實現的目標的情況下,可能正在尋找這樣的東西(編輯為PP_SEQ):
#define MAKE_ENUM(Name, Seq) enum Name { BOOST_PP_SEQ_ENUM(Seq) }
MAKE_ENUM(foo, (a)(b)(c));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.