태그 부착 구조 초기화 구문이란 무엇입니까?
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
'programing' 카테고리의 다른 글
C와 어셈블러는 실제로 무엇을 컴파일합니까? (0) | 2022.07.24 |
---|---|
Java에서 ==와 equals()의 차이점은 무엇입니까? (0) | 2022.07.24 |
Java 8: 스트림과 컬렉션의 퍼포먼스 (0) | 2022.07.24 |
일부 메서드는 조롱하지 않고 Mockito를 사용합니다. (0) | 2022.07.24 |
Maven surefire가 ForkedBooter 클래스를 찾을 수 없음 (0) | 2022.07.24 |