替换#define

时间:2010-10-04 15:54:03

标签: c++ switch-statement c-preprocessor

我想替换

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

带内联函数。

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

但我有一个switch case,它使用case语句中的预处理程序指令。怎么去转换呢?用switch替换if是唯一的选择吗?

4 个答案:

答案 0 :(得分:6)

switch case标签必须有一个整数常量表达式,因此你不能在case标签中进行函数调用。

使用宏没有任何问题。

如果你真的担心使用宏,#define就在switch语句之前,而#undef就在switch语句之后。

在C ++ 0x中,你将能够创建可以在常量表达式中使用的constexpr函数,但据我所知,没有编译器实际上完全支持C ++ 0x的那部分

答案 1 :(得分:0)

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

答案 2 :(得分:0)

  

有关switch语句的一个重要注意事项是case值可能只是常量整数表达式。

我能想到的唯一解决方法是一堆if-else语句。或者,您可以通过编程方式从2(1 <1)到1024(1 <&lt; 10)或者您的限制生成案例。表示您的switch语句如下所示:

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

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

答案 3 :(得分:0)

据我所知,包含switch,if和loop之类的控制语句的函数没有内联。

您可以确定是否使用宏。