2010-10-04 48 views
1

我想用一个内联函数来代替更换的#define

#define INTERVAL_MASK(b) (1 << (b)) 

int INTERVAL_MASK(int b) 
{ 
    return (1 << b); 
} 

但我有一个switch case,它使用在case陈述预处理指令。如何去转换这个?用if代替switch是唯一的选择?

回答

6

开关盒标签必须有一个整型常量表达式,所以你不能在case标签中进行函数调用。

对此使用宏没有任何问题。

如果您真的关心使用宏,#define它恰好在switch语句之前,#undef它紧跟在switch语句之后。

在C++ 0x中,您将能够创建constexpr可用于常量表达式的函数,但据我所知尽管编译器实际上完全不支持C++ 0x的那部分内容。

0

为什么不是const int interval_mask = (1 << b);

+1

大概是因为'b'在不同的地方有不同的值。 – 2010-10-04 16:00:00

+0

@therefromhere:但是,如果OP当前在switch语句中使用它们,则每一个都需要是编译时常量。 – 2010-10-04 16:02:14

+1

该OP可能用于'case INTERVAL_MASK(2):',case INTERVAL_MASK(17):',... – DarkDust 2010-10-04 16:08:15

0

需要注意switch语句一个重要的事情是那么回事值可能只是整型常量表达式。

我能想到的唯一解决方法就是一堆if-else语句。或者,您可以通过编程从2(1 < < 1)到1024(1 < < 10)或无论您的限制是多少,都可以生成这些情况。意思是你的switch语句看起来像这样:

switch(i) { 
    case 2: 
     //random stuff 
     break; 
    ... 
    case 1024: 
     //random 
     break; 
    ... 
} 

将会有一个单独的代码来生成这个。实际上并不会那么难。

0

据我所知,包含控制语句(如switch,if和loops)的函数没有内联。

如果您使用宏,您可以确定。