我在
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; }
我从来没有见过这个“三点”的构造(case’0’…’9′:)在C之前.它是一种有效的标准C语言吗?还是那种预处理魔法?这里发生了什么?
解决方法
@H_301_9@ 正如其他人所说,这是一个编译器特定的扩展.使用正确的选项(例如,gcc -std = c99 -pedantic)调用编译器,并且应该向您发出警告.我还会指出,除了另一个编译器可能无法实现的情况外,它的使用是潜在的危险的. ‘a’…’z’表示26个小写字母,但C标准不保证其值是连续的.例如,在EBCDIC中,字母中有标点符号.
另一方面,我怀疑gcc或者Sun C支持使用字符集不连续的字符集的系统. (它们是ASCII及其衍生产品,包括Latin-1,Windows-1252和Unicode.)
另一方面,它排除重音字母. (根据DRBD的使用方式,这可能是或可能不是一个问题.)