Miembros de estructura privada en C con const

Miembros de estructura privada en C con const

Es casi seguro que se trata de un comportamiento indefinido.

Escribir/modificar un objeto declarado como const está prohibido y hacerlo resulta en UB. Además, el enfoque que toma vuelve a declarar struct 2DPoint como dos tipos técnicamente diferentes, lo que tampoco está permitido.

Tenga en cuenta que esto (como comportamiento indefinido en general) no significa que "ciertamente no funcionará" o "debe fallar". De hecho, me parece bastante lógico que funcione, porque si uno lee la fuente inteligentemente, puede descubrir fácilmente cuál es su propósito y por qué podría considerarse correcto. Sin embargo, el compilador no es inteligente; en el mejor de los casos, es un autómata finito que no tiene conocimiento sobre lo que se supone el código. que hacer; solo obedece (más o menos) a las reglas sintácticas y semánticas de la gramática.


Esto viola C 2011 6.2.7 1.

6.2.7 1 requiere que dos definiciones de la misma estructura en diferentes unidades de traducción tengan un tipo compatible. No está permitido tener const en uno y no en el otro.

En un módulo, puede tener una referencia a uno de estos objetos y los miembros parecen ser constantes para el compilador. Cuando el compilador escribe llamadas a funciones en otros módulos, puede contener valores de los miembros const en registros u otro caché o en expresiones evaluadas parcial o totalmente más adelante en el código fuente que la llamada a la función. Luego, cuando la función modifique el miembro y regrese, el módulo original no tendrá el valor modificado. Peor aún, puede usar alguna combinación del valor modificado y el valor anterior.

Esta es una programación muy impropia.