C에서 지정된 이니셜라이저는 무엇입니까?
C에서 지정된 이니셜라이져가 무엇인지, 변수를 하나로 초기화하는 것이 어떤 의미인지 이해해야 하는 과제가 있습니다.
저는 그 용어에 익숙하지 않고 결정적인 정의를 찾을 수 없었습니다.
C에서 지정된 이니셜라이저는 무엇입니까?
지정된 이니셜라이저는 두 가지 맛으로 제공됩니다.
1) 어레이의 특정 요소를 빠르게 초기화할 수 있는 방법을 제공합니다.
int foo[10] = { [3] = 1, [5] = 2 };
모든 요소를 다음으로 설정합니다.foo
1로 설정되는 인덱스 3과 2로 설정되는 인덱스 5를 제외하고 0으로 설정됩니다.
2) 명시적으로 초기화하는 방법을 제공합니다.struct
회원들.예를 들어, 의 경우
struct Foo { int a, b; };
쓸 수 있습니다.
struct Foo foo { .a = 1, .b = 2 };
이 경우, 명시적으로 초기화되지 않은 구성원은 마치 인스턴스가 초기화된 것처럼 초기화됩니다.static
지속.
Both are standard C, but note that C++ does not support either (as constructors can do the job in that language.)
Designed Initializer는 ISO C99 이후 등장했으며 초기화 시 C로 초기화할 수 있는 새롭고 더 역동적인 방법입니다.struct
,union
혹은array
.
표준 초기화와 가장 다른 점은 요소를 고정된 순서로 선언할 필요가 없고 요소를 생략할 수도 있다는 것입니다.
GNU 가이드에서:
표준 C90은 초기화되는 배열 또는 구조의 요소 순서와 동일하게 초기화자의 요소가 고정된 순서로 나타나도록 요구합니다.
ISO C99에서 당신은 요소들을 무작위 순서로 줄 수 있고, 그것들이 적용되는 배열 인덱스나 구조 필드 이름을 지정할 수 있고, GNU C는 이것을 C90 모드에서도 확장으로 허용합니다.
예
1. 배열 색인
표준 초기화
int a[6] = { 0, 0, 15, 0, 29, 0 };
설계 초기화
int a[6] = {[4] = 29, [2] = 15 }; // or
int a[6] = {[4]29 , [2]15 }; // or
int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };
2. 구조체 조합:
표준 초기화
struct point { int x, y; };
설계 초기화
struct point p = { .y = 2, .x = 3 }; or
struct point p = { y: 2, x: 3 };
3. 연속적인 요소의 일반적인 C 초기화와 명명 요소를 결합합니다.
표준 초기화
int a[6] = { 0, v1, v2, 0, v4, 0 };
설계 초기화
int a[6] = { [1] = v1, v2, [4] = v4 };
4. 기타:
배열 초기화기의 요소 레이블 지정
int whitespace[256] = { [' '] = 1, ['\t'] = 1, ['\h'] = 1,
['\f'] = 1, ['\n'] = 1, ['\r'] = 1 };
'=' 앞에 일련의 '.fieldname' 및 '[index]' 지정자를 작성하여 초기화할 중첩 하위 개체를 지정합니다.
struct point ptarray[10] = { [2].y = yv2, [2].x = xv2, [0].x = xv0 };
가이드
C99표준안
이것은 특별히 깨달음을 주는 것이 아니라, 단지 나 자신의 병적인 호기심을 만족시키기 위해서입니다: WG14/N1256 C99 표준 초안.
6.7.8 초기화
designator-list: designator designator-list designator designator: [ constant-expression ] . identifier
제약
6 지정자가 양식을 가지고 있는 경우
[ constant-expression ]
그러면 현재 개체(아래 정의됨)는 배열 형식을 가져야 하고 식은 정수 상수 식이어야 합니다.배열의 크기가 알 수 없으면 음수가 아닌 값이 모두 유효합니다.
7 지정자가 양식을 가지고 있는 경우
. identifier
그러면 현재 객체(아래 정의)는 구조 또는 조합 유형을 가져야 하며 식별자는 해당 유형의 멤버 이름이어야 합니다.
의미론
17 각 브레이스로 둘러싸인 이니셜라이저 목록에는 관련된 현재 객체가 있습니다.지정이 존재하지 않는 경우, 현재 객체의 하위 객체들은 현재 객체의 종류에 따라 순서대로 초기화됩니다: 첨자 순서가 증가하는 배열 요소들, 선언 순서의 구조 부재들, 그리고 첫 번째로 명명된 조합의 구성원.129) 이와 대조적으로,지정하면 지정자가 설명한 하위 개체의 초기화가 시작됩니다.그런 다음 지정자가 설명한 다음 하위 개체부터 순서대로 초기화를 진행합니다.
18 각 지정자 목록은 가장 가까운 주변 가새 쌍과 관련된 현재 개체로 설명을 시작합니다.지정자 목록의 각 항목(순으로)은 현재 개체의 특정 멤버를 지정하고 다음 지정자(있는 경우)의 현재 개체를 해당 멤버로 변경합니다.131) 지정자 목록의 끝에 있는 현재 개체는 다음 이니셜라이저에서 초기화할 하위 개체입니다.
예제 9 배열은 다음과 같은 지정자를 사용하여 열거의 요소에 대응하도록 초기화할 수 있습니다.
enum { member_one, member_two }; const char *nm[] = { [member_two] = "member two", [member_one] = "member one", }
사례 11 장식되지 않은 초기화 목록이 잘못 이해될 수 있는 경우 지정자를 사용하여 명시적인 초기화를 제공할 수 있습니다.
struct { int a[3], b; } w[] = { [0].a = {1}, [1].a[0] = 2 };
언급URL : https://stackoverflow.com/questions/47202557/what-is-a-designated-initializer-in-c
'programing' 카테고리의 다른 글
gprof : 메인 프로그램과 연동되는 공유 라이브러리의 함수에 대한 호출 그래프 생성 방법 (0) | 2023.11.02 |
---|---|
WooCommerce - 주문 ID에서 구독 ID 가져오기 (0) | 2023.11.02 |
새 줄이 발견될 때까지 차단하면서 stdin에서 줄을 읽는 방법은? (0) | 2023.11.02 |
오래된 도커 컨테이너를 제거하는 방법 (0) | 2023.11.02 |
iOS 8에서 팝업을 올바르게 표시하는 방법 (0) | 2023.11.02 |