programing

C에서 지정된 이니셜라이저는 무엇입니까?

muds 2023. 11. 2. 22:10
반응형

C에서 지정된 이니셜라이저는 무엇입니까?

C에서 지정된 이니셜라이져가 무엇인지, 변수를 하나로 초기화하는 것이 어떤 의미인지 이해해야 하는 과제가 있습니다.

저는 그 용어에 익숙하지 않고 결정적인 정의를 찾을 수 없었습니다.

C에서 지정된 이니셜라이저는 무엇입니까?

지정된 이니셜라이저는 두 가지 맛으로 제공됩니다.

1) 어레이의 특정 요소를 빠르게 초기화할 수 있는 방법을 제공합니다.

int foo[10] = { [3] = 1, [5] = 2 };

모든 요소를 다음으로 설정합니다.foo1로 설정되는 인덱스 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

반응형