2009-04-13 5 views
5

Je suis en train d'apprendre C et je suis tombé sur quelque chose de bizarre:Pourquoi ne puis-je pas attribuer de manière interchangeable avec deux structures ayant un contenu identique?

struct 
{ 
    int i; 
    double j; 
} x, y; 

struct 
{ 
    int i; 
    double j; 
} z; 

Ici, vous pouvez voir que j'ai créé deux struct s qui sont identiques dans leurs éléments.

Pourquoi est-ce que quand j'essaye d'assigner x = z cela va générer une erreur de compilation mais pas x = y? Ils ont le même contenu, alors pourquoi ne puis-je pas les allers-retours les uns avec les autres?

Y at-il un moyen que je peux faire ce que je peut affecter x = z? Ou doivent-ils simplement être les mêmes struct.

Est-ce que les gourous C peuvent me diriger dans la bonne direction?

Répondre

13

Ils ont le même contenu, mais pas le même type. Si elles sont destinées à être du même type, il suffit de typedef x z;. Si ce n'est pas la même chose, mais qu'il se trouve juste qu'il contient les mêmes champs, il est préférable de créer une fonction séparée qui assignera les champs correctement.


Mon style habituel pour déclarer struct en C comprend le typedef, donc j'ai oublié de le mentionner (désolé!). Voici la syntaxe:

typedef struct 
{ 
    int foo; 
    double bar; 
} x; 

/* Further down, if needed */ 
typedef x z; 
+0

Quand vous dites typedef x z; Comment ça marche? Pouvez-vous élaborer un peu sur ce que vous voulez dire pour pouvoir typer la structure et en créer des instances? – Mithrax

+0

'typedef struct x z' – Ismael

8

Faire des types structurés de manière identique les mêmes que l'on appelle « duck typing ». Ceci est fait dans certaines langues, mais pas dans C.

+0

Jamais entendu l'appeler ainsi. –

+0

"Si elle marche comme un canard et se moque comme un canard, je dirais que c'est un canard." – Albert

6

Le compilateur ne calcule pas "l'équivalence de type" entre les structures qui peuvent avoir la même structure, donc en ce qui le concerne, la deuxième structure n'a rien à voir avec le premier.

Il peut faire x et y car ils sont déclarés en même temps. Pourquoi avez-vous redéclaré la structure? Vous devriez probablement typedef la structure une fois (par exemple, dans un fichier H) pour en faire un type réel, puis déclarer des instances.

Here's a good tutorial on typedefs for structs.

+0

Merci pour le tutoriel! – Mithrax

5
struct mystruct 
{ 
int i; 
double j; 
}; 

struct mystruct x, y; 
struct mystruct z; 

Si vous avez l'intention de copier des données entre eux, vous devez les déclarer avec la même identité. Vous avez deux déclarations, peu importe qu'elles soient égales pour le compilateur, elles sont deux structures différentes, et le compilateur n'est pas censé détecter leur similarité.

0

C différencie struct s en fonction du nom, et si elles sont anonymes, les définitions de structure diffèrent.

De toute façon, classique C ne permet pas x = z lorsque x et z sont structs - est-ce une addition ANSI ou C99? De toute façon, vous devriez plutôt utiliser

#include <string.h> 
memcpy(&x, &z, sizeof(x)); 
Questions connexes