sourcecode

리눅스 커널에서 이상한 코드를 발견했는데 누가 설명해줄 수 있나요?

codebag 2023. 10. 15. 17:18
반응형

리눅스 커널에서 이상한 코드를 발견했는데 누가 설명해줄 수 있나요?

initramfs.c에서 이것을 발견했습니다. 이 구문을 본 적이 없는데 누가 이것이 무엇을 하는지 설명해줄 수 있나요?

static __initdata int (*actions[])(void) = {
  [Start]   = do_start,
  [Collect] = do_collect,
  [GotHeader] = do_header,
  [SkipIt]  = do_skip,
  [GotName] = do_name,
  [CopyFile]  = do_copy,
  [GotSymlink]  = do_symlink,
  [Reset]   = do_reset,
};

소스 코드 (366행): initramfs.c

인덱스별 순서 외 배열 초기화입니다.글을 쓰는 것과 같습니다.

actions[Start] = do_start;
actions[Collect] = do_collect;

정적 이니셜라이저로 사용할 수 있다는 점만 제외하고요

기능은 ISO C99에서 지정된 이니셜라이저로 알려진 기능입니다.배열을 생성하고 해당 배열의 특정 요소를 초기화합니다. 반드시 첫 번째 N 순서일 필요는 없습니다.다음 토막글과 맞먹습니다.

static __initdata int (*actions[SOME_SIZE])(void);
actions[Start]   = do_start;
actions[Collect] = do_collect;
actions[GotHeader] = do_header;
actions[SkipIt]  = do_skip;
actions[GotName] = do_name;
actions[CopyFile]  = do_copy;
actions[GotSymlink]  = do_symlink;
actions[Reset]   = do_reset;

배열의 크기가 필요한 만큼만 클 뿐이며(가장 큰 인덱스보다 하나 이상 큰) 전역 범위에서 정적으로 초기화할 수 있다는 점을 제외하고는 위 코드를 전역 범위에서 실행할 수 없습니다.

이것은 ANSI C89의 기능은 아니지만, GCC는 C89로 코드를 컴파일할 때에도 이 기능을 확장으로 제공합니다.

배열 초기화 시 지정자

괄호로 표시된 표현식을 지정자라고 하며, 이는 단순히 선언과 같은 순서로 초기화자를 정렬하는 것보다 필드나 요소의 이름을 지정하여 배열이나 구조를 초기화하는 구문입니다.

언급URL : https://stackoverflow.com/questions/2241448/i-found-some-bizarre-code-in-the-linux-kernel-could-some-one-explain-it-to-me

반응형