[c] C에서 배열 초기화에서 대괄호는 무엇을 의미합니까?

static uint8_t togglecode[256] = {
    [0x3A] CAPSLOCK,
    [0x45] NUMLOCK,
    [0x46] SCROLLLOCK
};

여기서의 의미는 무엇입니까 [0x3A]? 나는 다음과 같은 진술만을 배웠다.int a[2] = {1, 2};



답변

배열 의 n 번째 요소를 초기화하는 것을 의미 합니다. 귀하가 제공 한 예는 다음을 의미합니다.

togglecode[0x3A] == CAPSLOCK
togglecode[0x45] == NUMLOCK
togglecode[0x46] == SCROLLLOCK

이를 “지정된 이니셜 라이저” 라고 하며 실제로 C99 표준의 일부입니다. 그러나 =가없는 구문 은 그렇지 않습니다. 해당 페이지에서 :

GCC 2.5 이후로 사용되지 않았지만 GCC에서 여전히 허용하는 이에 대한 대체 구문 [index]은 요소 값 앞에 =.


답변

GCC 문서 에 따르면 이것은 ISO C99를 준수합니다. 이를 “지정된 이니셜 저”라고합니다.

배열 인덱스를 지정하려면 요소 값 앞에`[index] = ‘를 씁니다. 예를 들면

 int a[6] = { [4] = 29, [2] = 15 };

다음과 같다

 int a[6] = { 0, 0, 15, 0, 29, 0 };

이 구문은 전에 본 적이 없지만 gcc 4.4.5와 -Wall로 컴파일했습니다. 성공적으로 컴파일되었고 경고가 없었습니다.

이 예제에서 볼 수 있듯이 특정 배열 요소를 초기화하고 나머지 요소는 그대로 둘 수 있습니다.


답변

이것은 C99에서 도입되었으며 지정된 이니셜 라이저 라고합니다. .

기본적으로 나머지를 기본값으로두고 배열의 특정 값을 설정할 수 있습니다.

이 특별한 경우 배열 인덱스는 키보드 스캔 코드입니다. 0x3a는 IS 세트 # 1 스캔 코드 대 (10.6 절 참조) CapsLock키가 0x45있다 NumLock하고부터 0x46이다 ScrollLock.

위의 첫 번째 링크에 다음과 같이 명시되어 있습니다.

int a[6] = { [4] = 29, [2] = 15 };

다음과 같습니다.

int a[6] = { 0, 0, 15, 0, 29, 0 };

흥미롭게도 링크 =에 필요하다고 나와 있지만 여기서는 그렇지 않은 것 같습니다.


답변

지정된 이니셜 라이저 의 구문에 가깝습니다.C99 기능인 .

기본적으로, 예를 들어 배열의 일부를 초기화합니다.

int aa[4] = { [2] = 3, [1] = 6 };

배열의 두 번째 값을 6으로, 세 번째 값을 3으로 초기화합니다.

귀하의 경우 배열 오프셋은 16 진수 (0x3a)로 발생하여 배열의 58 번째 요소를 CAPSLOCK 값으로 초기화합니다.이 값은 아마도 표시하는 코드 위의 코드에 정의되어 있습니다.

이없는 코드 버전은 =gcc 특정 확장 인 것 같습니다.


답변