Gar*_*art 13 c switch-statement
我在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;
}
Run Code Online (Sandbox Code Playgroud)
我之前从未case '0' ... '9':在C中看过这个"三点"构造().它是一种有效的标准C语言吗?或者是某种预处理器魔术?这里发生了什么?
正如其他人所说,这是一个特定于编译器的扩展.使用正确的选项调用编译器(比如说gcc -std=c99 -pedantic),它应该警告你.
我还要指出,除了另一个编译器可能没有实现它之外,它的使用是有潜在危险的. 'a' ... 'z'表示26个小写字母 - 但C标准不保证它们的值是连续的.在EBCDIC,例如,有字母之间的标点符号.
另一方面,我怀疑gcc或Sun C是否支持使用字母不连续的字符集的系统.(它们是ASCII及其所有衍生物,包括Latin-1,Windows-1252和Unicode.)
另一方面,它排除了重音字母.(取决于DRBD使用方式,这可能是也可能不是问题.)
| 归档时间: |
|
| 查看次数: |
6037 次 |
| 最近记录: |