수색…


통사론

  • (type) {initializer-list}

비고

C 표준은 C11-§6.5.2.5 / 3에서 다음과 같이 말합니다.

괄호로 묶인 형식 이름과 그 다음에 중괄호로 묶는 이니셜 라이저 목록으로 구성된 접미사 식은 복합 리터럴 입니다. 값이 이니셜 라이저 목록에서 제공되는 이름이없는 객체를 제공합니다. 99)

각주 99는 말합니다 :

이것은 캐스트 표현식과 다릅니다. 예를 들어 형 변환은 스칼라 유형 또는 void 만의 변환을 지정하고 캐스트 표현식의 결과는 좌변 값이 아닙니다.

참고 사항 :

문자열 리터럴과 const 한정 유형을 가진 복합 리터럴은 별개의 객체를 지정할 필요가 없습니다. 101)

101) 이것은 구현이 문자열 리터럴과 상수 복합 리터럴에 대해 동일한 또는 중복 된 표현으로 저장 공간을 공유 할 수있게 해줍니다.

예제는 표준으로 제공됩니다.
C11-§6.5.2.5 / 13 :

문자열 리터럴과 마찬가지로 const 한정 복합 리터럴은 읽기 전용 메모리에 배치 할 수 있으며 공유 할 수도 있습니다. 예를 들어,

(const char []){"abc"} == "abc"

리터럴의 저장 공간이 공유되면 1을 얻을 수 있습니다.

복합 리터럴의 정의 / 초기화

복합 리터 2은 정의 된 | 위에서 작성된 이름이없는 오브젝트입니다. 이 개념은 C99 표준에서 처음 소개되었습니다. 복합 리터럴의 예는 다음과 같습니다.

C 표준, C11- §6.5.2.5 / 9의 예 :

int *p = (int [2]){ 2, 4 };

p 는, 2 개의 int의 무명 배열의 최초의 요소의 주소에 초기화됩니다.

복합 리터럴은 lvalue입니다. 명명되지 않은 객체의 저장 기간은 static (파일 범위에 리터럴이 나타나는 경우) 또는 자동 (블록 범위에 리터럴이 나타나는 경우) 중 하나이며, 후자의 경우 컨트롤이 둘러싸는 블록을 벗어날 때 객체의 수명이 끝납니다.

void f(void)
{
    int *p;
    /*...*/
    p = (int [2]){ *p };
    /*...*/
}

p 에는 2 개의 int 배열의 최초의 요소의 주소가 할당됩니다. 최초의 주소는 이전에 p 가리키는 값을 가지고, 두 번째는 0입니다. [...]

여기서 p 는 블록이 끝날 때까지 유효합니다.

지정자가있는 복합 리터럴

(또한 C11에서)

  struct point {
    unsigned x;
    unsigned y;
  };

  extern void drawline(struct point, struct point);

 // used somewhere like this
 drawline((struct point){.x=1, .y=1}, (struct point){.x=3, .y=4});

drawline 함수 drawlinestruct point 유형의 두 개의 인수를받습니다. 첫 번째 좌표 값은 x == 1y == 1 인 반면 두 번째 좌표 값은 x == 3y == 4

배열 길이를 지정하지 않고 복합 리터럴

int *p = (int []){ 1, 2, 3};  

이 경우 배열의 크기는 지정되지 않았으므로 이니셜 라이저의 길이에 의해 결정됩니다.

초기화 프로그램의 길이가 지정된 배열 크기보다 작은 복합 문자

int *p = (int [10]){1, 2, 3}; 

복합 리터럴의 나머지 요소는 암시 적으로 0 으로 초기화됩니다.

읽기 전용 복합 리터럴

복합 리터럴은 lvalue이므로 요소를 수정할 수 있습니다. 읽기 전용 복합 리터럴은 const 한정자를 (const int[]){1,2} 와 같이 사용하여 지정할 수 있습니다.

임의의식이 포함 된 복합 리터럴

함수 안에서 복합 리터럴은 C99 이후의 초기화와 마찬가지로 임의의 표현식을 가질 수 있습니다.

void foo()
{
    int *p;
    int i = 2; j = 5;
    /*...*/
    p = (int [2]){ i+j, i*j };
    /*...*/
}


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow