>백엔드 개발 >C++ >C 11이 C99와 같은 지정 초기화 프로그램을 지원하지 않는 이유는 무엇입니까?

C 11이 C99와 같은 지정 초기화 프로그램을 지원하지 않는 이유는 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-12 16:01:09574검색

Why Doesn't C  11 Support Designated Initializers Like C99?

C 11의 지정 이니셜라이저 제외: 위원회의 이론적 근거

C99에서 지정 이니셜라이저는 구조체의 특정 멤버를 초기화하는 편리한 방법을 제공합니다. , 다음 그림과 같이 예:

struct Person {
    int height;
    int weight;
    int age;
};

int main() {
    Person p = { .age = 18 };
}

그러나 C 11에서는 이 구문이 유효하지 않습니다. C 11 표준 위원회는 C99의 실용성에도 불구하고 지정 이니셜라이저 지원을 포함하겠다는 제안을 반복적으로 거부했습니다.

제외 이유

위원회의 주요 관심사는 불확실한 C99 지정 이니셜라이저의 하위 표현식 평가 순서. 다음 예를 고려하십시오.

struct X {
    int c;
    char a;
    float b;
};

struct X foo = { .a = (char)f(), .b = g(), .c = h() };

C99에서 이러한 함수 호출(f(), g() 및 h())이 실행되는 순서는 정의되지 않습니다. 이러한 모호함은 이러한 함수가 상호 작용하거나 부작용이 있는 경우 불확실한 프로그램 동작으로 이어질 수 있습니다.

C의 엄격한 초기화 요구 사항

C99의 유연한 평가 순서와 달리 C는 초기화 절의 엄격한 순차적 평가를 요구합니다. 결과적으로 C에서 지정된 이니셜라이저를 구현하려면 다른 동작이 필요합니다.

f();
g();
h();

이로 인해 기존 C99 구현과의 호환성이 손상될 수 있습니다.

제안된 솔루션 및 제한 사항

c 20 표준은 P0329R4의 도입으로 이 문제를 부분적으로 해결합니다. 지정된 초기화 프로그램 그러나 이 지원은 불확실한 평가 순서와 관련된 복잡성과 잠재적인 함정을 피하기 위해 제한됩니다.

결론

지정 이니셜라이저를 제외하기로 한 C 11 표준 위원회의 결정이 주도되었습니다. 일관되고 예측 가능한 초기화 프로세스를 유지하는 것에 대한 우려 때문입니다. Boost는 지정된 이니셜라이저에 대한 구현을 제공하지만 표준 위원회는 복잡성을 도입하거나 호환성을 손상시키지 않고 이러한 기능을 C에 통합하는 과제를 강조했습니다.

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

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