加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在案例中为三重点(case’0’…’9′:)有效的C语言切换语法?

发布时间:2020-12-16 06:03:03 所属栏目:百科 来源:网络整理
导读:我在 DRBD软件的开源代码文件( user/drbdtool_common.c)中注意到这一点 const char* shell_escape(const char* s){ /* ugly static buffer. so what. */ static char buffer[1024]; char *c = buffer; if (s == NULL) return s; while (*s) { if (buffer + s
我在 DRBD软件的开源代码文件( user/drbdtool_common.c)中注意到这一点
const char* shell_escape(const char* s)
{
    /* ugly static buffer. so what. */
    static char buffer[1024];
    char *c = buffer;

    if (s == NULL)
        return s;

    while (*s) {
        if (buffer + sizeof(buffer) < c+2)
            break;

        switch(*s) {
        /* set of 'clean' characters */
        case '%': case '+': case '-': case '.': case '/':
        case '0' ... '9':
        case ':': case '=': case '@':
        case 'A' ... 'Z':
        case '_':
        case 'a' ... 'z':
            break;
        /* escape everything else */
        default:
            *c++ = '';
        }
        *c++ = *s++;
    }
    *c = '';
    return buffer;
}

我从来没有见过这个“三点”的构造(case’0’…’9′:)在C之前.它是一种有效的标准C语言吗?还是那种预处理魔法?这里发生了什么?

解决方法

正如其他人所说,这是一个编译器特定的扩展.使用正确的选项(例如,gcc -std = c99 -pedantic)调用编译器,并且应该向您发出警告.

我还会指出,除了另一个编译器可能无法实现的情况外,它的使用是潜在的危险的. ‘a’…’z’表示26个小写字母,但C标准不保证其值是连续的.例如,在EBCDIC中,字母中有标点符号.

另一方面,我怀疑gcc或者Sun C支持使用字符集不连续的字符集的系统. (它们是ASCII及其衍生产品,包括Latin-1,Windows-1252和Unicode.)

另一方面,它排除重音字母. (根据DRBD的使用方式,这可能是或可能不是一个问题.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读