我正在尝试创建一个以范围为参数的宏 我知道,这可能不是一件好事等等 我正在尝试这个并且遇到了预处理器寻找逗号和括号的问题......问题在于枚举。
如何在作为宏参数的作用域内声明枚举?
当编译器看到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的答案!
乔
答案 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));