> 백엔드 개발 > C++ > C 이니셜라이저 목록에서 외부 중괄호를 언제 생략해야 합니까?

C 이니셜라이저 목록에서 외부 중괄호를 언제 생략해야 합니까?

Barbara Streisand
풀어 주다: 2024-12-17 09:27:24
원래의
686명이 탐색했습니다.

When to Omit Outer Braces in C   Initializer Lists?

초기화 목록에서 외부 중괄호를 생략하는 경우

C에서 구조체 또는 배열과 같은 집계 유형을 초기화할 때 다음과 같은 문제가 발생할 수 있습니다. 초기화 목록에서 외부 중괄호를 사용할지 여부에 대한 질문입니다. POD(Plain Old Data)이고 std::array와 같은 사용자 정의 생성자가 없는 집계 유형의 경우 외부 중괄호가 필요합니다. 그러나 내장 유형과 같이 이러한 제한이 없는 집계의 경우 이러한 중괄호를 생략할 수 있습니다.

POD 집계에 대한 명시적 중괄호

귀하의 예에서는 표준::배열 a1에는 std::array가 집계 및 POD 유형이므로 명시적인 중괄호가 필요합니다. 집계의 첫 번째 멤버는 크기가 N인 배열입니다. 여기서 N은 템플릿 인수로 전달됩니다. 이 멤버를 직접 초기화하려면 내부 배열에 추가 중괄호를 사용해야 합니다. 잘못된 코드 예에서는

std::array<A, 2> a1 = 
{
  {0, 0.1},
  {2, 3.4}
};
로그인 후 복사

내부 중괄호가 없기 때문에 컴파일러가 "초기화 프로그램이 너무 많습니다"라고 보고합니다. 중괄호를 사용한 올바른 초기화는 다음과 같습니다.

std::array<A, 2> a1 = 
{
  {{
    {0, 0.1},
    {2, 3.4}
  }}
};
로그인 후 복사

비 POD 집계에 대한 중괄호 제거

POD 집계와 달리 내장 유형과 같은 비 POD 집계 이니셜라이저 목록에는 명시적인 외부 중괄호가 필요하지 않습니다. 예를 들어,

std::array<double, 2> a2 = {0.1, 2.3};
로그인 후 복사

예제에는 내부 배열에 중괄호가 포함되어 있지 않습니다. 이는 double이 집계가 아니고 초기화 목록이 구성 double 요소를 직접 초기화하기 때문입니다.

표준의 추가 통찰력

C 표준은 언제 초기화 목록에서 외부 중괄호를 생략할 수 있습니다.

  • 초기화 목록이 왼쪽 중괄호로 시작하면 하위 집계가 초기화되며 추가 중괄호가 필요하지 않습니다.
  • 초기화 프로그램 목록이 왼쪽 중괄호로 시작하지 않으면 현재 하위 집계를 채우기에 충분한 초기화 절만 목록에서 가져오고 나머지는 모두 목록에서 가져옵니다. 절은 집계의 다음 멤버를 초기화합니다.

이를 통해 중괄호를 사용하거나 사용하지 않고 초기화할 수 있습니다. 초기화 절은 초기화할 멤버 수와 일치합니다.

위 내용은 C 이니셜라이저 목록에서 외부 중괄호를 언제 생략해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿