2009-04-13 8 views
5

estoy tratando de aprender C y he encontrado algo raro:¿Por qué no puedo asignar intercambiablemente con dos estructuras que tienen contenidos idénticos?

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

struct 
{ 
    int i; 
    double j; 
} z; 

Aquí, se puede ver que he creado dos struct s que son idénticos en sus elementos.

¿Por qué cuando trato de asignar x = z generará un error de compilación pero x = y no? Tienen los mismos contenidos, entonces ¿por qué no puedo asignarlos de ida y vuelta el uno con el otro, independientemente?

¿Hay alguna manera de que pueda hacer esto para que pueda asignar x = z? O simplemente tienen que ser el mismo struct.

¿Pueden los gurús de C señalarme en la dirección correcta?

Respuesta

13

Tienen el mismo contenido, pero no del mismo tipo. Si están destinados a ser del mismo tipo, simplemente typedef x z;. Si no son lo mismo, pero contienen los mismos campos, es mejor crear una función separada que asigne los campos correctamente.


Mi estilo habitual para declarar estructuras en C incluye el typedef, por lo que se olvidó de mencionar que (lo siento!). Esta es la sintaxis:

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

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

Cuando diga typedef x z; ¿Cómo funciona? ¿Puedes explicar un poco sobre lo que quieres decir para poder escribir la estructura y crear instancias de ella? – Mithrax

+0

'typedef struct x z' – Ismael

8

Haciendo tipos de idéntica estructura del mismo se llama "duck typing". Esto se hace en algunos idiomas, pero no en C.

+0

Nunca lo escuché llamar así. –

+0

"Si camina como un pato y grazna como un pato, lo llamaría pato". – Albert

6

El compilador no calcula la "equivalencia de tipo" entre las estructuras que pueden tener la misma estructura, por lo que a él respecta, la segunda estructura no tiene nada que ver con el primero.

Puede hacer xey debido a que se declaran al mismo tiempo.

¿Por qué está redeclarando la estructura? Probablemente deberías tipear la estructura una vez (por ejemplo, en un archivo H) para convertirla en un tipo real y luego declarar instancias.

Here's a good tutorial on typedefs for structs.

+0

¡Gracias por el tutorial! – Mithrax

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

struct mystruct x, y; 
struct mystruct z; 

Si va a copiar datos entre ellos, debe declarar con la misma identidad. Tiene dos declaraciones, no importa que sean iguales para el compilador, son dos estructuras diferentes, y el compilador no debe detectar su similitud.

0

C diferencia struct s según el nombre, y si son anónimos, las diferentes definiciones de estructura son diferentes.

De todos modos, el clásico C no permite x = z cuando x y z son estructuras. ¿Es eso una adición ANSI o C99? De todos modos, debería utilizar

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