Antes de que se estandarizara C, muchos compiladores no habrían tenido dificultades para manejar tipos de tamaño cero siempre que el código nunca intentara restar un puntero a un tipo de tamaño cero de otro. Tales tipos eran útiles y apoyarlos era más fácil y barato que prohibirlos. Sin embargo, otros compiladores decidieron prohibir estos tipos, y algunos códigos de aserción estática pueden haberse basado en el hecho de que chillarían si el código intentara crear una matriz de tamaño cero. Los autores de la Norma se enfrentaron a una elección:
Permitir que los compiladores acepten silenciosamente declaraciones de arreglos de tamaño cero, incluso en los casos en que el propósito de tales declaraciones sea desencadenar un diagnóstico y abortar la compilación, y requiera que todos los compiladores acepten tales declaraciones (aunque no necesariamente en silencio) como produciendo objetos de tamaño cero. .
Permita que los compiladores acepten silenciosamente declaraciones de arreglos de tamaño cero, incluso en los casos en que el propósito de tales declaraciones sea desencadenar un diagnóstico y abortar la compilación, y permitir que los compiladores que encuentren tales declaraciones cancelen la compilación o la continúen a su gusto.
Exija que las implementaciones emitan un diagnóstico si el código declara una matriz de tamaño cero, pero luego permita que las implementaciones cancelen la compilación o la continúen (con la semántica que consideren adecuada) a su gusto.
Los autores del Estándar optaron por el # 3. En consecuencia, las declaraciones de arreglos de tamaño cero son consideradas por la "extensión" del Estándar, a pesar de que tales construcciones fueron ampliamente soportadas antes de que el Estándar las prohibiera.
El estándar C ++ permite la existencia de objetos vacíos, pero en un esfuerzo por permitir que las direcciones de los objetos vacíos se puedan usar como tokens, exige que tengan un tamaño mínimo de 1. Para que un objeto que no tiene miembros tenga un tamaño de Por tanto, 0 violaría la Norma. Sin embargo, si un objeto contiene miembros de tamaño cero, el estándar C ++ no impone requisitos sobre cómo se procesa más allá del hecho de que un programa que contenga dicha declaración debe desencadenar un diagnóstico. Dado que la mayoría del código que usa tales declaraciones espera que los objetos resultantes tengan un tamaño de cero, el comportamiento más útil para los compiladores que reciben dicho código es tratarlos de esa manera.