Errores de redefinición en archivos .h

//list.h file typedef struct _lnode{ struct _lnode *next; size_t row; size_t column; short data; }lnode; typedef struct _llist{ struct _lnode *head; size_t size; }llist; //matrix.h file typedef struct _matrix{ size_t width; size_t height; size_t k; int **data; }matrix; //smatrix.h file #include "list.h" #include "matrix.h" typedef struct _smatrix{ size_t width; size_t height; size_t k; llist data; }smatrix; smatrix* make_smatrix(matrix *m); 

El archivo smatrix.h incluye los archivos list.h y matrix.h. Si incluyo esos archivos de encabezado en el archivo smatrix.h, obtengo

  redefinition of 'lnode'. redefinition of '_llist' and redefinition of '_matrix' errors. 

Si tomé esos archivos heder de smatrix.h, el error desapareció, pero se queja del tipo de matriz en el parámetro de función. Quiero llamar a las funciones definidas en los archivos list.h y matrix.h en el archivo smatrix.c … ¿Qué hago? Gracias por adelantado..

Posible problema de múltiples inclusiones.

Trate de guardar sus archivos de cabecera con

lista de archivos.h

 #ifndef _LISTH_ #define _LISTH_  #endif 

archivo matrix.h

 #ifndef _MATRIXH_ #define _MATRIXH_  #endif 

También evitará que tenga redefiniciones si tiene un bucle en las inclusiones del encabezado.

necesita incluir guardias en sus archivos de cabecera.

Bueno, desde su código publicado, lo que creo que falta es al principio de cada archivo * .h:

 #ifndef _some_unique_identifier_for_each_header #define _some_unique_identifier_for_each_header ...header contents #endif //_some_unique_identifier_for_each_header 

o un

 #pragma once 

Si tu comstackdor lo soporta.

Sin esto, si el encabezado se incluye varias veces de varias fonts, obtendrá errores relacionados con la redefinición.

Probablemente incluya smatrix.h y list.h en algún otro archivo. Debes evitar eso. La forma habitual de hacerlo es usar include guards .

Estas son macros que se comprueban con #ifdef al principio del archivo (con #endif al final), y #define #ifdef ... #endif dentro de #ifdef ... #endif , asegurando así que incluso si incluye el mismo archivo múltiple veces, el comstackdor solo lo leerá una vez, la primera vez, y omitirá todo el rest.