簡體   English   中英

范圍內的枚舉聲明,該范圍是宏的參數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM