2011-08-12 24 views
11

私はDRBDソフトウェア(user/drbdtool_common.cケース内に3つの点(ケース '0' ... '9' :)が有効な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言語ですか?それともプリプロセッサの魔法のようなものですか?何が起きてる?

+2

[Dプログラミング言語](http://www.d-programming-language.org/statement)に標準で関心があります.html#SwitchStatement) –

+0

これはFWIWでもサポートされています。 –

答えて

9

これは、コンパイラ固有の拡張です。適切なオプション(たとえば、gcc -std=c99 -pedantic)でコンパイラを起動すると、警告が表示されます。

また、別のコンパイラが実装していない点を除いて、その使用は潜在的に危険であると指摘します。 'a' ... 'z'は26小文字を表しますが、C標準ではその値が連続しているとは限りません。たとえば、EBCDICには、文字の間に句読点文字があります。

一方、gccまたはSun Cのいずれかの文字が、文字セットではない文字セットを使用するシステムに対応しているかどうかは疑問です。 (これらはASCIIであり、Latin-1、Windows-1252、Unicodeなどのすべての派生語です。)

一方、アクセント付き文字は除きます。 (DRBDがどのように使用されているかによっては、それは問題である場合もありません)

+3

EBCDICをサポートするgccのポートが1つある場合は、s390x-ibm-tpf – AProgrammer

10

これは非標準の言語拡張です。

おそらくGCC:http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Case-Ranges.html

+1

は次の規格に含まれますか? – osgx

+1

@osgx:わかりません。 –

+1

@osgx:いいえ、少なくとも[C1X](http://en.wikipedia.org/wiki/C1X)の最新の草稿ではありません。 –

3

これは標準Cではありませんが、Sun Cコンパイラの拡張機能です。

オラクルのWebサイトの2.7 Case Ranges in Switch Statementsを参照してください。

更新:明らかに、Oracleだけではありません! :-)

関連する問題