C에서이 "[0… 255] ="구문은 무엇입니까?


108

로 다스 려 js0n.c

코드 구문은 다음과 같습니다.

    static void *gostruct[] =
    {
        [0 ... 255] = &&l_bad,
        ['\t'] = &&l_loop, [' '] = &&l_loop, ['\r'] = &&l_loop, ['\n'] = &&l_loop,
        ['"'] = &&l_qup,
        [':'] = &&l_loop, [','] = &&l_loop,
        ['['] = &&l_up, [']'] = &&l_down, // tracking [] and {} individually would allow fuller validation but is really messy
        ['{'] = &&l_up, ['}'] = &&l_down,
        ['-'] = &&l_bare, [48 ... 57] = &&l_bare, // 0-9
        [65 ... 90] = &&l_bare, // A-Z
        [97 ... 122] = &&l_bare // a-z
    };

........
.......

l_bad:
    *vlen = cur - json; // where error'd
    return 0;

........
........

아무도 여기서 무슨 일이 일어나고 있는지 설명 할 수 있습니까? 어떤 구문을 수행 [0 ... 255]하고 &&l_bad여기에서?

답변:


109

... GCC에서 제공하는 확장입니다.

https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html#Designated-Inits

요소 범위를 동일한 값으로 초기화하려면 [first ... last] = value. 이것은 GNU 확장입니다. 예를 들면

 int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };

&& 또 다른 확장입니다

https://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html#Labels-as-Values

단항 연산자를 사용하여 현재 함수 (또는 포함 함수)에 정의 된 레이블의 주소를 가져올 수 있습니다 &&. 값에는 유형이 void *있습니다. 이 값은 상수이며 해당 유형의 상수가 유효한 모든 곳에서 사용할 수 있습니다. 예를 들면 :

 void *ptr;
 /* ... */
 ptr = &&foo;

22
코드는 아마도 파서에 대해 인덱스에 ASCII 값을 사용하는 점프 테이블을 만드는 것입니다.
래칫 괴물

1
내가 말할 수있는 한 특히 JSON 파서.
Kevin

1
@KevinM 의미가 있습니다. rvalue에 연산자 주소 (&)를 적용하는 것이 언제 구문 오류가 되었습니까? 아마도 C99에서 추측하고 있습니까? 마지막으로 Visual C ++를 정기적으로 사용한 것은 1998 년경이었는데, 이는 C99 이전 ANSI 표준이었고 컴파일러는이를 허용했습니다 &.
dodgethesteamroller

3
@dodgethesteamroller는와 &&완전히 별개의 토큰 &이므로 표준 C 문법이 &&x의 값 범주에 관계없이 "x의 주소 주소"로 해석 할 수있는 방법은 없습니다 &x.
Tavian Barnes

4
@dodgethesteamroller는 : --언제나처럼 구문 분석 --, 그리고 &&언제나처럼 구문 분석됩니다 &&. C99 §6.4¶4 : 다음 전처리 토큰은 전처리 토큰을 구성 할 수있는 가장 긴 문자 시퀀스입니다
ninjalj
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.