2011-03-25 11 views
7
//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 el archivo list.h y los archivos matrix.h. Si incluyo los archivos de cabecera de archivo smatrix.h entonces consigoErrores de redefinición en archivos .h

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

Si los archivos Tomé heder nuestro archivo de smatrix.h luego fue el error de distancia, pero se queja de tipo de matriz en el parámetro de la función. Quiero llamar a las funciones definidas en los archivos list.h y matrix.h en el archivo smatrix.c .. ¿Qué debo hacer? Gracias de antemano ..

Respuesta

16

Posible problema de inclusiones múltiples.

Trata de proteger sus archivos de cabecera con

archivo list.h

#ifndef _LISTH_ 
#define _LISTH_ 

<your code> 

#endif 

matrix.h archivo

#ifndef _MATRIXH_ 
#define _MATRIXH_ 

<your code> 

#endif 

Se evitará que usted también tiene redefiniciones si tiene un bucle en encabezado inclusiones.

+0

_list.h_ como esta? – codereviewanskquestions

+0

@LCYSoft Editado –

+1

¡Gracias a un loooot! – codereviewanskquestions

1

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

Estos son macros que consulte con #ifdef al comienzo del archivo (con #endif en el extremo) y #define en el interior del #ifdef ... #endif, asegurando así que incluso si usted incluye el mismo archivo varias veces, el compilador solo léalo una vez, en la primera vez, y omita todo el resto.

2

bien a partir del 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 una

#pragma once 

si su compilador lo soporta.

Sin esto, si el encabezado se incluye varias veces de varias fuentes, se obtienen errores relacionados con la redefinición.

Cuestiones relacionadas