2009-11-19 43 views
0

我正在尝试创建一个将作用域作为参数的宏。
我知道,这可能不是一件好事等。等
我试图这样做,并得到了预处理器查找逗号和括号的问题......问题与枚举。作为宏的参数的作用域内的枚举声明

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

当编译器在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 
    }; 
}); 

它不会因为enum内部的逗号而编译,因为co mpiler认为它是宏的分隔符。例如:

int a(){ 
    int x = anyfunction(1, 2); 
} 

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

对不起,不能够解释前面......我的英语不是太好的字样只是不停地跳跃我= [

泰的答案!
Joe

+2

你能确定你是什么意思的范围是什么?举一些例子? –

+2

请发布您的尝试... –

+0

如何注册命名空间? – jmucchiello

回答

1

这听起来像是你将预处理器推到了它愿意去的地方。虽然它不够高雅,但如何在两个(前一个和一个后一个)中打破宏观,而不是传递一个“范围”作为参数,您将范围与前后宏包围起来。

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

SOMACRO({ ... }); 

你反而会做这样的事情:

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

是的,我说在我的文章。我只是在验证是否有另一种方式,用于学习目的。使用两个宏,一个在范围的开始处和一个在结尾处的区别在于编码器可以忘记其中的一个,特别是最后一个。我要做的是创建一个叫做初学者和终结者宏的完整的宏,如果编码器需要枚举,那么他将不会使用这个宏,而是完整的方式,或者我应该推它来使用这两个宏,而不管伪造结局的缺陷? – Jonathan

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 
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 
} 

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

0

你已经注意到了什么问题,articleboostpro.com总结了这个问题。
有变通,但我会去利用Boost.Preprocessor

不知道究竟你想达到什么语法,这样的事情可能是你在找什么(编辑以PP_SEQ):

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