case关键字支持范围匹配

case关键字支持范围匹配

Content #

GNU C语言允许case关键字匹配一个数值范围,由此可以取代多级的if条件检测语句。以下这段代码的执行条件是待匹配字符为小写字母:

case 'a'...'z':   /from 'a' to 'z'/
break;

下面是Linux内核中的代码例子。

//<arch/x86/platform/uv/tlb_uv.c>
static int local_atoi(const char *name)
{
    int val = 0;
    for (;; name++) {
        switch (*name) {
        case '0' ... '9':
            val = 10*val+(*name-'0');
            break;
        default:
            return val;
        }
    }
}

另外,还可以用整形数来表示范围,但是这里需要注意在“…”两边有空格,否则编译会出错。

//<drivers/usb/gadget/udc/at91_udc.c>
static int at91sam9261_udc_init(struct at91_udc *udc)
{
    for (i = 0; i < NUM_ENDPOINTS; i++) {
        ep = &udc->ep[i];
        switch (i) {
        case 0:
            ep->maxpacket = 8;
            break;
        case 1 ...3:
            ep->maxpacket = 64;
            break;
        case 4 ...5:
            ep->maxpacket = 256;
            break;
        }
    }
}

From #

奔跑吧Linux内核——入门篇一个64位操作系统的设计与实现