programing

태그 부착 구조 초기화 구문이란 무엇입니까?

prostudy 2022. 7. 24. 21:18
반응형

태그 부착 구조 초기화 구문이란 무엇입니까?

struct file_operations scull_fops = {
.owner = THIS_MODULE,
.llseek = scull_llseek,
.read = scull_read,
.write = scull_write,
.ioctl = scull_ioctl,
.open = scull_open,
.release = scull_release,
};

이 선언에서는 표준 C 태그 부착 구조 초기화 구문을 사용합니다.

누가 설명 좀 해줄래?

집약 이니셜라이저(의 이니셜라이저)를 사용하는 경우{}) "기존" ANSI C 언어(C89/90)에서는 구조체 멤버별로 첫 번째부터 순서대로 개별 이니셜라이저를 제공해야 합니다.예를들면

struct S { int a, b, c, d; };

struct S s = { 1, 2, 3, 4 };
/* 1 for `s.a`, 2 for `s.b` and so on... */

모든 구성원에 대해 이니셜라이저를 지정할 필요는 없습니다.즉, 언제든지 중지할 수 있습니다(나머지 구성원은 0으로 초기화됩니다).

어떤 이유로 구조체의 세 번째 멤버를 명시적으로 초기화하는 것만 신경 쓴다면 첫 번째 멤버와 두 번째 멤버에 대해 "더미" 명시적 이니셜라이저를 제공해야 합니다(원하는 세 번째 멤버에 도달하기 위해서만).

/* We only care to explicitly initialize `s.c` */
struct S s = { 0, 0, 3 };
/* but we have to explicitly initialize `s.a` and `s.b` as well */

또는 특정 초기화를 완전히 포기합니다(일반적인 것으로 대체하지 않음).= { 0 }특정 멤버에 대한 후속 할당을 사용합니다.

struct S s = { 0 };
s.c = 3;

이 할당 기반 접근법의 한 가지 주목할 만한 이점은 구성원의 위치로부터 독립적이라는 것입니다.c선언에 있어서struct S.

C 언어(C99)의 새로운 사양에서는, 「태그 부착」인 이니셜라이저를 사용하고, 필요한 멤버명을 지정해,{}

struct S s = { .c = 3 };

이렇게 하면 원하는 멤버만 명시적으로 초기화할 수 있습니다(나머지 멤버는 컴파일러로 초기화됩니다).이렇게 하면 입력을 줄일 수 있을 뿐만 아니라 집약 이니셜라이저가 구조 유형 선언에서 멤버가 지정된 순서로부터 독립됩니다.

Aggregate Initializer는 어레이에서도 사용할 수 있습니다.또한 C99는 어레이에 대한 "태그 부착" 초기화를 지원합니다.어레이의 「태그」는, 다음의 예에 나타나 있습니다.

int a[10] = { [5] = 3 };
/* `a[5]` is initialized with 3, the rest of `a` is zero-initialized */

C 언어는 집약 초기화에 대해 "모두 또는 아무것도" 방식을 계속 고수하고 있음을 다시 한 번 주의해 주십시오.구조체 또는 배열의 1개(또는 일부) 멤버에 대해 명시적 이니셜라이저를 지정하면 집약 전체가 초기화되고 명시적 이니셜라이저가 없는 멤버는 제로 초기화됩니다.

구조 구성원의 이름을 사용하여 구조를 초기화합니다. 즉, 각 구성원의 초기화는 해당 구성원의 이름으로 "태그 부착"됩니다.

이러한 유형의 초기화에 관해 언급할 가치가 있는 또 다른 이점은 구조 멤버의 순서를 변경할 수 있다는 것입니다.경우에 따라서는 같은 하드웨어 캐시 라인에서 자주 액세스하는 멤버에 포인터를 배치함으로써 성능을 향상시킬 수 있습니다.

언급URL : https://stackoverflow.com/questions/3016107/what-is-tagged-structure-initialization-syntax

반응형