我在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 = '\0';
return buffer;
}
我以前从未在C中看到过这种“三点”结构(case '0' ... '9':
)。它是一种有效的标准C语言吗?或者是某种预处理器魔术?这里发生了什么?
答案 0 :(得分:10)
这是一种非标准的语言扩展。
可能是GCC:http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Case-Ranges.html。
答案 1 :(得分:9)
正如其他人所说,这是一个特定于编译器的扩展。使用正确的选项(例如gcc -std=c99 -pedantic
)调用编译器,它应该警告你。
我还要指出,除了另一个编译器可能没有实现它之外,它的使用是有潜在危险的。 'a' ... 'z'
表示26个小写字母 - 但C标准不保证它们的值是连续的。例如,在EBCDIC
中,字母中有标点字符。
另一方面,我怀疑gcc或Sun C是否支持使用字符不连续的字符集的系统。 (它们是ASCII及其所有衍生物,包括Latin-1,Windows-1252和Unicode。)
另一方面,它排除了重音字母。 (取决于DRBD
的使用方式,这可能是也可能不是问题。)
答案 2 :(得分:3)
不,这是extension of GCC。
答案 3 :(得分:3)