大小写(大小写';0';.&';9';:)中的三个点是否是有效的C语言开关语法?

大小写(大小写';0';.&';9';:)中的三个点是否是有效的C语言开关语法?,c,switch-statement,C,Switch Statement,我在软件的开源代码文件()中注意到了这一点 const char*shell_转义(const char*s) { /*丑陋的静态缓冲区。那又怎样*/ 静态字符缓冲区[1024]; char*c=缓冲区; 如果(s==NULL) 返回s; 而(*s){ 如果(缓冲区+sizeof(缓冲区)

我在软件的开源代码文件()中注意到了这一点

const char*shell_转义(const char*s)
{
/*丑陋的静态缓冲区。那又怎样*/
静态字符缓冲区[1024];
char*c=缓冲区;
如果(s==NULL)
返回s;
而(*s){
如果(缓冲区+sizeof(缓冲区)

我以前从未在C中见过这种“三点”结构(
大小写“0”…“9”:
)。它是一种有效的标准C语言吗?或者这是某种预处理器魔法?这是怎么回事

这是一种非标准的语言扩展


可能是GCC:。

不,这是一个。

这不是标准C,而是Sun C编译器中的一个扩展

请参阅:在Oracle的网站上


更新:显然,不仅仅是Oracle!:-)

正如其他人所说,这是特定于编译器的扩展。使用正确的选项调用编译器(比如,
gcc-std=c99-pedantic
),它应该会警告您

我还将指出,它的使用有潜在的危险,除了另一个编译器可能无法实现它之外<代码>'a'…'z'
表示26个小写字母,但C标准不能保证它们的值是连续的。例如,在
EBCDIC
中,字母之间有标点符号

另一方面,我怀疑gcc或Sun C是否支持使用字母不连续的字符集的系统。(它们使用ASCII及其所有派生代码,包括拉丁语-1、Windows-1252和Unicode。)


另一方面,它不包括重音字母。(取决于如何使用
DRBD
,这可能是一个问题,也可能不是问题。)

它是否会包含在下一个标准中?@osgx:no,至少在最新的版本中没有。@osgx:not in C11,not in C17,并且不建议用于C2X。如果有一个gcc端口支持EBCDIC,它是s390x ibm tpffor,是业界感兴趣的it标准,它在clang上也受FWIW支持。,
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 = '\0';
    return buffer;
}