2012-08-30 4 views
18

Supposons que j'ai une structure entièrement définie avec l'étiquette MyStruct, et supposons que x, y, ..., z sont des valeurs autorisées pour ses champs. PourquoiPourquoi les structs ne peuvent pas être affectés directement?

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

autorisés, mais

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

n'est pas autorisé? Je trouve cela très ennuyeux. Dans le second cas, où je l'ai déjà déclaré q, je dois attribuer une valeur à chaque champ, un par un:

q.X = x; q.Y = y; ... q.Z = z; 

X, Y, ..., Z sont les champs de MyStruct. Y a-t-il une raison derrière tout cela?

+0

rvalue de la mission n'est pas concret et son en cours d'exécution. l'affectation initiale est cependant concrète et disponible en binaire (plus probable dans la section .BSS s'il s'agit d'un fichier elf). Si vous souhaitez vous affecter des structures, vous pouvez affecter q à quelque chose d'initialisé. comme; structure MyStruct w = {x, y, .., z}; q = w – sardok

Répondre

26

Ce que vous cherchez est un composé littéral. Cela a été ajouté à la langue dans C99.

Votre premier cas:

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

est une syntaxe spécifique à l'initialisation. Votre deuxième cas, dans les pedantics de la langue n'est pas l'initialisation, mais l'affectation. Le côté droit de l'affectation doit être une structure du type correct. Avant C99, il n'y avait pas de syntaxe dans le langage pour écrire un struct literal, ce que vous essayez de faire. {x, y, .., z} ressemblait à un bloc avec une expression à l'intérieur. Si l'on était tenté d'essayer de le considérer comme une valeur littérale, bien que le langage ne l'ait pas fait, on ne pouvait pas être sûr de son type. (. Dans votre contexte, vous pourriez faire une bonne estimation)

Pour permettre cela et résoudre le problème de type, C99 a ajouté la syntaxe de sorte que vous pouvez écrire:

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

+1 pour indiquer qu'il s'agit de C99. Je ne savais pas que c'était possible, ce qui est probablement dû au fait que nous devons travailler avec de vieux compilateurs. – Leo

23

Vous pouvez faire cela, mais vous devez fournir le type de la structure avant votre ensemble:

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

Voici un [lien vers ideone] (http://ideone.com/rB1Fz) avec un exemple. – dasblinkenlight

+2

Mais seulement en C99 (voir la réponse d'Avi Berger) – AAT

+0

@AAT Vous avez raison, c'est une fonctionnalité qui a été ajoutée en C99. Cependant, puisque C99 existe depuis plus d'une décennie, il est devenu presque synonyme de C dans de nombreux contextes. – dasblinkenlight

Questions connexes