将GNU案例范围扩展转换为标准C

时间:2012-03-29 09:42:53

标签: c gcc switch-statement gnu

GNU案例范围扩展允许在switch语句中使用case范围:

switch (value) {
    case 1 ... 8:
        printf("Hello, 1 to 8\n");
        break;
    default:
        printf("Hello, default\n");
        break;
}

您如何将其转换为标准C(c99或c89)?添加单个案例陈述?

编辑:你如何具体处理非常大的switch语句?

4 个答案:

答案 0 :(得分:7)

switch(value) 
{
    case 1:
    case 2:
    case 3:
    case 4:
    case 5:
    case 6:
    case 7:
    case 8:
        printf("Hello, 1 to 8\n"); 
        break;     
    default:         
        printf("Hello, default\n");         
        break; 
} 

编辑:回答评论 如果您的案例太多,那么您可能需要考虑将 switch-case 替换为 if-else 结构。它可以更清洁,简洁和可读。

if (value >=1 && value <= 8) 
{    
    printf("Hello, 1 to 8\n"); 
} 
else 
{   
    printf("Hello, default\n"); 
}  

答案 1 :(得分:3)

我会使用if声明:

if (value >=1 && value <= 8) {
    printf("Hello, 1 to 8\n");
} else {
    printf("Hello, default\n");
} 

如果需要更多范围,则可以添加额外的else if语句,

答案 2 :(得分:2)

如果长距离可以做,有点脏,但是,

switch(what) {
case 1:
    /* do 1 */
    break;
case 2:
    /* do 2 */
    break;
default:
    if (what > 31 && what < 127) {
         /* do 32 to 126 */
    }
}

最好可能是为了一起删除所有的开关。

对嵌套非常严格。如果你想要开关,出于某种原因,那么上面的更好的是:

if (value > 31 && value < 127) {
  /* Do something */
} else {
    switch (value) {
    case 1:
        ...
    }
}

Ach,抱歉再次编辑。 这个会更干净。

if (value > 31 && value < 127) {
  /* Do something */
} else if (value > 127 && value < 178) {

} else if ( ...

}

switch (value) {
case 1:
    ...
}

答案 3 :(得分:2)

或者,由于数字彼此相邻,您可以手动优化开关盒。

typedef void(*func_t)(void);

#define CASES_N 9

void func0 (void)
{
  printf("Hello, 0\n");
}

void func1 (void)
{
  printf("Hello, 1 to 8\n");
}

static const func_t execute [CASES_N] =
{
  &func0,
  &func1,
  &func1,
  &func1,
  &func1,
  &func1,
  &func1,
  &func1,
  &func1
};

int main()
{
  if(what < CASES_N)
  {
    execute[what]();
  }
  else
  {
    printf("Hello, default\n");
  }
}

此代码与编译器优化的switch语句基本相同。