C 집계 이니셜 라이저에서 [N… M]은 무엇을 의미합니까?


101

에서 sys.c의 라인 123 :

void *sys_call_table[__NR_syscalls] = 
{
    [0 ... __NR_syscalls-1] = sys_ni_syscall,
#include <asm/unistd.h>
};

sys_call_table배열에 대한 일반적인 포인터입니다. 그러나 표기법은 무엇입니까?

[0 ... __NR_syscalls-1]

무엇입니까 ...?


편집 :
내가 여기에 또 다른 C의 트릭을 배웠 #include <asm/unistd.h>됩니다 전처리 및 그 내용으로 대체하고 할당 [0 ... _NR_syscalls-1].


2
아니요, 배열에 대한 포인터가 아니라 포인터의 배열입니다. 배열에 대한 포인터를 선언 할 것void (*sys_call_table)[__NR_syscalls]
패트릭 Schlüter을

@tristopia 당신이 맞습니다. 내가 의미하는 것은 char *argv[]. 결정된.
Amumu

답변:


90

지정된 이니셜 라이저를 사용한 초기화입니다. 입니다.

범위 기반 초기화는 gnu gcc 확장입니다.

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

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

휴대용이 아닙니다. 컴파일-pedantic 함께 하면 그렇게 말합니다.

여기서 어떻게 작동합니까?
전처리 기는 범위 기반 구조에서 #include <asm/unistd.h>실제 내용 ( 기타 기호 상수 및 유형을 정의하고 기타 함수를 선언 )으로 대체 한 다음 포인터 배열을 초기화하는 데 추가로 사용됩니다.


휴대용이 아닌 것 같습니다. 그렇습니까?
Ivaylo Strandjev

5
@Mehrdad는 Microsoft C 컴파일러가 c99 표준을 준수합니까? 여기에 제 사건을
맡깁니다

3
@Mehrdad : 실제로는 지정 이니셜 라이저의 범위 기반 구성 만 gcc 확장이며 지정된 이니셜 라이저 자체는 C 표준에서 허용됩니다.
Alok 저장

2
@Mehrdad : 미안합니다. 저는 어떤 불꽃 미끼에도 참여하고 싶지 않습니다. 제 의도는 오해했다고 생각되는 미묘한 세부 사항을 명확히하는 것이 었습니다.
Alok 저장

2
@Mehrdad : 명확하게 말하면 범위 구성은 gcc (및 확장을 구현하는 컴파일러)로만 이식 가능하며, 일반적으로 지정된 이니셜 라이저는 C99 (또는 적어도 특정 기능)를 지원하는 컴파일러로만 이식 가능합니다.
Keith Thompson
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.