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.