C가 표준화되기 전에는 코드에서 크기가 0 인 유형에 대한 포인터 하나를 다른 유형에서 빼려고 시도하지 않는 한 많은 컴파일러가 크기가 0 인 유형을 처리하는 데 어려움이 없었을 것입니다. 이러한 유형은 유용했으며 지원하는 것이 금지하는 것보다 쉽고 저렴했습니다. 그러나 다른 컴파일러는 이러한 유형을 금지하기로 결정했으며 일부 정적 어설 션 코드는 코드가 크기가 0 인 배열을 만들려고하면 삐걱 거리는 사실에 의존했을 수 있습니다. 표준 작성자는 다음과 같은 선택에 직면했습니다.
이러한 선언의 목적이 진단을 트리거하고 컴파일을 중단하는 경우에도 컴파일러가 크기가 0 인 배열 선언을 자동으로 수락하도록 허용하고 모든 컴파일러가 크기가 0 인 개체를 생성하는 것처럼 이러한 선언을 수락하도록 요구합니다 (반드시 침묵하지는 않음). .
이러한 선언의 목적이 진단을 트리거하고 컴파일을 중단하는 경우에도 컴파일러가 크기가 0 인 배열 선언을 자동으로 받아들이도록 허용하고 이러한 선언을 접하는 컴파일러가 컴파일을 중단하거나 여유 시간에 계속할 수 있도록합니다.
코드가 크기가 0 인 배열을 선언하는 경우 구현에서 진단을 발행하도록 요구하지만, 구현에서 컴파일을 중단하거나 (적합하다고 생각하는 의미에 관계없이) 계속 진행할 수 있습니다.
표준의 저자는 # 3을 선택했습니다. 결과적으로 표준이 금지하기 전에 이러한 구성이 널리 지원 되었음에도 불구하고 표준 "확장"에서 크기가 0 인 배열 선언을 간주합니다.
C ++ 표준은 빈 개체의 존재를 허용하지만 빈 개체의 주소를 토큰으로 사용할 수 있도록하기 위해 최소 크기 1을 요구합니다. 구성원이없는 개체의 경우 크기는 따라서 0은 표준을 위반합니다. 그러나 개체에 크기가 0 인 멤버가 포함 된 경우 C ++ 표준은 이러한 선언을 포함하는 프로그램이 진단을 트리거해야한다는 사실 외에는 처리 방법에 대한 요구 사항을 부과하지 않습니다. 이러한 선언을 사용하는 대부분의 코드는 결과 객체의 크기가 0 일 것으로 예상하므로 이러한 코드를 수신하는 컴파일러에게 가장 유용한 동작은 이러한 방식으로 처리하는 것입니다.