作为宏参数的作用域内的枚举声明

时间:2009-11-19 21:30:34

标签: c++ scope macros enums brackets

我正在尝试创建一个以范围为参数的宏 我知道,这可能不是一件好事等等 我正在尝试这个并且遇到了预处理器寻找逗号和括号的问题......问题在于枚举。

如何在作为宏参数的作用域内声明枚举?

当编译器看到enum itens之间的逗号时,它将其作为分隔符。

如果你很想知道我为什么加入这个,那是因为我需要注册我的命名空间和类,对于我们在关闭时需要知道的命名空间,所以我想创建一个最初调用静态的宏注册命名空间的函数,封装其内容,最后调用一个从注册表中删除命名空间的静态函数 使用宏,编码器可以更容易地执行此操作,并确保他不会忘记删除括号末尾的命名空间。

谢谢,

编辑:

我想要一个接受范围作为参数的宏:

#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);
 }

会正常编译,因为逗号在双括号内。

很抱歉因为早些时候无法解释...我的英语不是那么好,而且这些话一直在跳过我= [

Ty的答案!

4 个答案:

答案 0 :(得分:1)

听起来你正在将预处理器推到它愿意去的地方。虽然它不是那么优雅,但如何将宏分成两个(一个前置和一个后置),而不是将“作用域”作为参数传递,你可以用宏前后宏围绕你的作用域。

所以,如果您的宏看起来像:

SOMACRO({ ... });

你会做类似的事情:

PRESOMACRO();
{ ... };
POSTSOMACRO();

答案 1 :(得分:0)

#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

答案 2 :(得分:0)

您正尝试使用宏复制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
} 

我不知道你在讨论关于枚举的内容。

答案 3 :(得分:0)

您已经注意到问题所在, boostpro.com 上的article可以解决问题。
有解决办法,但我会去利用Boost.Preprocessor

如果不确切地知道你想要在语法上实现什么,这样的东西可能就是你要找的东西(编辑为PP_SEQ):

#define MAKE_ENUM(Name, Seq) enum Name { BOOST_PP_SEQ_ENUM(Seq) }
MAKE_ENUM(foo, (a)(b)(c));