2012-08-30 11 views
18

Supongamos que tengo una estructura completamente definida con la etiqueta MyStruct, y supongo que x, y, ..., z son valores permitidos para sus campos. ¿Por qué se¿Por qué las estructuras no se pueden asignar directamente?

struct MyStruct q = {x,y,..,z}; 

mascotas, pero

struct MyStruct q; 
q = {x,y,...,z}; 

no está permitido? Encuentro esto muy molesto. En el segundo caso, donde he declarado previamente q, necesito 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?

+0

rvalue de la asignación no es concreto y su en tiempo de ejecución. sin embargo, la asignación inicial es concreta y está disponible en formato binario (lo más probable en la sección .BSS si se trata de un archivo elf). si quiere asignar estructuras entre sí, puede asignar q a algo inicializado. me gusta; struct MyStruct w = {x, y, .., z}; q = w – sardok

Respuesta

26

Lo que se busca es un compuesto literal. Esto fue agregado al lenguaje en C99.

su primer caso:

struct MyStruct q = {x,y,..,z}; 

es una sintaxis específica para la inicialización. Su segundo caso, en la pedante 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 adentro. Si uno se inspiró para tratar de considerarlo como un valor literal, aunque el lenguaje no lo hizo, uno no podía estar seguro de su tipo. (. En su contexto, se puede hacer una buena suposición)

Para permitir esto y resolver el problema tipo, C99 añadió sintaxis por lo que podría escribir:

q = (struct MyStruct){x,y,...,z}; 
+3

+1 para especificar que es C99. No sabía que esto era posible, lo cual es probable, ya que tenemos que trabajar con compiladores antiguos. – Leo

23

usted puede hacer esto, pero hay que suministrar el tipo de la estructura antes de que su agregado:

struct MyStruct q; 
q = (struct MyStruct){x,y,...,z}; 
+0

Aquí hay un [enlace a ideone] (http://ideone.com/rB1Fz) con un ejemplo. – dasblinkenlight

+2

Pero solo en C99 (vea la respuesta de Avi Berger) – AAT

+0

@AAT Está en lo correcto, es una característica que se ha agregado en C99. Sin embargo, dado que C99 ha existido por más de una década, se ha convertido prácticamente en sinónimo de C en muchos contextos. – dasblinkenlight

Cuestiones relacionadas