【发布时间】:2010-12-18 12:17:14
【问题描述】:
我正在尝试创建一个将范围作为参数的宏。
我知道,这可能不是一件好事等等。
我正在尝试这个并遇到预处理器查找逗号和括号的问题......问题出在枚举上。
如何在作为宏参数的范围内声明枚举?
当编译器看到枚举项之间的逗号时,它会将其作为分隔符。
如果你想知道我为什么进入这个,是因为我需要注册我的命名空间和类,对于命名空间我需要知道它们何时关闭,所以我想创建一个最初调用静态的宏注册命名空间、封装其内容并最终调用从注册表中删除命名空间的静态函数的函数。
使用宏,编码人员可以更轻松地执行此操作,并确保他不会忘记删除括号末尾的命名空间。
谢谢,
乔
编辑:
我想要一个接受范围作为参数的宏:
#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);
}
可以正常编译,因为逗号在双括号内。
抱歉没能早点解释……我的英文不是很好,单词一直跳过我=[
回答问题!
乔
【问题讨论】:
-
您能定义一下您的作用域吗?举几个例子?
-
如何注册命名空间?
-
我能想到的唯一一种带有括号的枚举声明形式是
for:for(enum foo { a, b, c };;) ;。你可以让它总是传递(enum-declaration;finish;),其中finish是由宏构造的一些布尔循环控制变量。 -
对不起,我不得不去,直到现在才看答案。我将编辑帖子以帮助您,但我猜 Klatchko 回答了它。
-
请注意
GCC(可能还有其他人,因为它是 C99 和 C++0x)有可变参数宏,所以你可以这样做#define MYMACRO(...) __VA_ARGS__
标签: c++ scope macros enums brackets