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 특정 확장 인 것 같습니다.