c - kpop - tag de las 20 preguntas
¿Por qué las estructuras no se pueden asignar directamente? (2)
Supongamos que tengo una estructura completamente definida con la etiqueta MyStruct
y supongo que x, y, ..., z
son valores permitidos para sus campos. Por que es
struct MyStruct q = {x,y,..,z};
permitido, pero
struct MyStruct q;
q = {x,y,...,z};
¿No se permite? Me parece muy molesto. En el segundo caso, donde previamente he declarado q
, debo asignar un valor a cada campo, uno por uno:
q.X = x; q.Y = y; ... q.Z = z;
donde X, Y, ..., Z
son los campos de MyStruct
. ¿Hay alguna razón detrás de esto?
Lo que buscas es un literal compuesto. Esto fue agregado al lenguaje en C99.
Tu primer caso:
struct MyStruct q = {x,y,..,z};
Es una sintaxis específica para la inicialización. Su segundo caso, en la pedantica del lenguaje no es la inicialización, sino la asignación. El lado derecho de la tarea debe ser una estructura del tipo correcto. Antes de C99 no había sintaxis en el lenguaje para escribir una estructura literal, que es lo que estás tratando de hacer. {x, y, .., z} parecía un bloque con una expresión dentro. Si uno estuviera inspirado para tratar de considerarlo como un valor literal, aunque el lenguaje no lo hiciera, no podría estar seguro de su tipo. (En su contexto, podría hacer una buena suposición).
Para permitir esto y resolver el problema de tipo, C99 agregó sintaxis para que pudiera escribir:
q = (struct MyStruct){x,y,...,z};
Puede hacer esto, pero debe proporcionar el tipo de estructura antes de su agregado:
struct MyStruct q;
q = (struct MyStruct){x,y,...,z};