0

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

如何在作为宏参数的范围内声明枚举?

当编译器看到枚举项之间的逗号时,它将它作为分隔符。

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

谢谢,

编辑:

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

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

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

很抱歉不能早点解释...我的英语不是那么好,单词一直跳过我=[

泰的答案!

4

4 回答 4

1

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

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

SOMACRO({ ... });

您将改为执行以下操作:

PRESOMACRO();
{ ... };
POSTSOMACRO();
于 2009-11-19T21:40:46.500 回答
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
于 2009-11-19T21:42:08.230 回答
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
} 

我不知道你在谈论什么关于枚举。

于 2009-11-19T21:57:21.463 回答
0

您已经注意到问题所在,boostpro.com上的一篇文章总结了问题所在。 有解决方法,但我会使用Boost.Preprocessor

在不确切知道您要在语法上实现什么的情况下,您可能正在寻找类似这样的东西(编辑为 PP_SEQ):

#define MAKE_ENUM(Name, Seq) enum Name { BOOST_PP_SEQ_ENUM(Seq) }
MAKE_ENUM(foo, (a)(b)(c));
于 2009-11-19T22:09:44.413 回答