我想用一个内联函数来代替更换的#define
#define INTERVAL_MASK(b) (1 << (b))
。
int INTERVAL_MASK(int b)
{
return (1 << b);
}
但我有一个switch case
,它使用在case
陈述预处理指令。如何去转换这个?用if
代替switch
是唯一的选择?
我想用一个内联函数来代替更换的#define
#define INTERVAL_MASK(b) (1 << (b))
。
int INTERVAL_MASK(int b)
{
return (1 << b);
}
但我有一个switch case
,它使用在case
陈述预处理指令。如何去转换这个?用if
代替switch
是唯一的选择?
开关盒标签必须有一个整型常量表达式,所以你不能在case标签中进行函数调用。
对此使用宏没有任何问题。
如果您真的关心使用宏,#define
它恰好在switch语句之前,#undef
它紧跟在switch语句之后。
在C++ 0x中,您将能够创建constexpr
可用于常量表达式的函数,但据我所知尽管编译器实际上完全不支持C++ 0x的那部分内容。
为什么不是const int interval_mask = (1 << b);
?
需要注意switch语句一个重要的事情是那么回事值可能只是整型常量表达式。
我能想到的唯一解决方法就是一堆if-else语句。或者,您可以通过编程从2(1 < < 1)到1024(1 < < 10)或无论您的限制是多少,都可以生成这些情况。意思是你的switch语句看起来像这样:
switch(i) {
case 2:
//random stuff
break;
...
case 1024:
//random
break;
...
}
将会有一个单独的代码来生成这个。实际上并不会那么难。
据我所知,包含控制语句(如switch,if和loops)的函数没有内联。
如果您使用宏,您可以确定。
大概是因为'b'在不同的地方有不同的值。 – 2010-10-04 16:00:00
@therefromhere:但是,如果OP当前在switch语句中使用它们,则每一个都需要是编译时常量。 – 2010-10-04 16:02:14
该OP可能用于'case INTERVAL_MASK(2):',case INTERVAL_MASK(17):',... – DarkDust 2010-10-04 16:08:15