>백엔드 개발 >C++ >C 11에 지정된 초기화 프로그램이 없는 이유는 무엇입니까?

C 11에 지정된 초기화 프로그램이 없는 이유는 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-08 21:11:11671검색

Why Were Designated Initializers Absent from C  11?

C의 지정 이니셜라이저: C 11에 없는 이유

C 11에서 지정 이니셜라이저의 생략은 많은 프로그래머에게 여전히 흥미로운 질문으로 남아 있습니다. . C99에서는 .age = 18과 같은 지정된 초기화 구문을 사용하여 구조체의 특정 멤버를 편리하게 초기화할 수 있습니다. 그러나 이 기능은 C 11에는 눈에 띄게 없습니다.

제외 근거

C 11 표준 위원회는 지정된 이니셜라이저에 대한 제안을 반복적으로 거부했습니다. 그 근거는 몇 가지 고유한 복잡성에서 비롯됩니다.

불확실한 실행 순서:
C99에는 지정된 초기화 표현식을 평가하기 위한 특정 규칙이 부족합니다. 평가가 발생하는 순서는 불확실하며 잠재적으로 프로그램 동작에 불일치가 발생할 수 있습니다. 대조적으로 C는 초기화 절 평가의 엄격한 순서를 시행합니다.

호환성 문제:
C에서 지정된 초기화를 구현하려면 기존 C99 구현과의 호환성을 깨야 합니다. 이로 인해 코드 마이그레이션 시 불일치 및 잠재적인 오류가 발생할 수 있습니다.

중첩 및 배열 제한:
C99에서는 지정된 초기화의 중첩과 배열의 지정된 초기화가 허용됩니다. 이러한 기능은 언어 일관성을 손상시키지 않고 C에 통합하기가 어려웠습니다.

C99 Standards Clash:
C99의 지정된 이니셜라이저는 모든 멤버를 지정하지 않고도 멤버 초기화를 허용합니다. 이는 구조체의 모든 멤버가 지정자를 사용하여 초기화되어야 하거나 전혀 초기화되지 않아야 한다는 C의 요구 사항과 대조됩니다.

C 20의 제한된 지원

업계 요구에 부응하여, C 위원회는 이후 C 20에서 지정된 이니셜라이저에 대한 제한된 지원을 도입했습니다. 그러나 이 구현은 위에서 언급한 문제를 해결하는 제한 사항을 부과합니다. 지정된 초기화는 엄격한 선언 순서로 사용해야 하며 중첩 및 배열 초기화는 지원되지 않으며 구조체 멤버 전체 또는 전혀 초기화되지 않아야 합니다.

대안

C99 스타일 지정 초기화 프로그램이 없음에도 불구하고 C는 클래스 초기화를 위한 대체 방법을 제공합니다. 멤버:

  • 생성자 초기화: 클래스 정의 내에서 명시적인 멤버 초기화를 허용합니다.
  • 멤버 초기화 목록: 멤버 초기화를 직접 활성화합니다. 생성자 내에서.
  • 집계 초기화: 지정된 초기화와 유사하지만 집계 유형(예: 구조체)에 적용됩니다.

위 내용은 C 11에 지정된 초기화 프로그램이 없는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.