大小写(大小写';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;
}