Sind dreifach Punkten in einem Fall (case '0' ... '9':) gültige C-Sprache syntax der switch-Anweisung?
Bemerkte ich das in open-source-code-Dateien für DRBD software (Benutzer/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;
}
Habe ich noch nie gesehen, diese "triple dot" - Konstruktion (case '0' ... '9':
) in C vor. Ist es eine gültige standard-C-Sprache? Oder ist das eine Art Präprozessor-Magie? Was ist denn hier Los?
- für die interessierten es ist standard in der D programming language
- Es unterstützt clang auch so schön.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie schon andere gesagt haben, dies ist eine compiler-spezifische Erweiterung. Aufrufen des Compilers mit den richtigen Optionen (sagen wir
gcc -std=c99 -pedantic
), und es sollte Sie warnen.Ich werde auch darauf hinweisen, dass seine Verwendung ist potentiell gefährlich, abgesehen von der Tatsache, dass ein anderer compiler könnte nicht umzusetzen.
'a' ... 'z'
bezeichnet die 26 Kleinbuchstaben-aber der C-Standard garantiert nicht, dass Ihre Werte zusammenhängend sind. InEBCDIC
zum Beispiel, es gibt Satzzeichen-Zeichen unter den Buchstaben.Auf der anderen Seite bezweifle ich, dass Sie entweder gcc oder Sun-C unterstützt die Systeme, die einen Zeichensatz verwenden, in dem die Buchstaben nicht zusammenhängend. (Sie sind in ASCII und alle seine Derivate, einschließlich Latin-1, Windows-1252 und Unicode.)
Auf der anderen Seite, es schließt akzentuierte Buchstaben. (Je nachdem, wie
DRBD
verwendet wird, kann oder kann nicht ein Problem sein.)Das ist ein nicht-standard-Sprache-Erweiterung.
Wahrscheinlich GCC: http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Case-Ranges.html.
Nein, dies ist eine Erweiterung des GCC.
Dies ist kein standard-C, sondern ist eine Erweiterung fand in den Sun C-compiler.
Finden Sie unter: 2.7 Fall Reicht in Switch-Anweisungen auf der Oracle Website.
UPDATE: Scheinbar, nicht nur Oracle! 🙂