Pregunta

Estoy acaba de empezar con la programación modular en C. Creo que estoy haciendo algo mal con las inclusiones, porque estoy recibiendo una gran cantidad de errores y conflicting types for 'functionName' previous declaration of 'functionName' was here. Me he puesto guardas de inclusión en su lugar.

¿Conoce un tutorial claro que explica la programación modular en C, especialmente cómo el inclusiones trabajo?


Actualizar : He tratado de aislar mi problema. Aquí hay algo de código, conforme a lo solicitado.

Actualización 2 : código actualizado está por debajo. Los errores se han actualizado, también.

/*
 * main.c
 */
#include <stdio.h>
#include "aStruct.h"

int main() {
    aStruct asTest = createStruct();

    return 0;
}

/*
 * aStruct.h
 */
#ifndef ASTRUCT_H_
#define ASTRUCT_H_

struct aStruct {
    int value1;
    int value2;
    struct smallerStruct ssTest;
};
typedef struct aStruct aStruct;

aStruct createStruct();

#endif /* ASTRUCT_H_ */

/*
 * smallerStruct.h
 */
#ifndef SMALLERSTRUCT_H_
#define SMALLERSTRUCT_H_

struct smallerStruct {
    int value3;
};
typedef struct smallerStruct smallerStruct;

smallerStruct createSmallerStruct();

#endif /* SMALLERSTRUCT_H_ */

/*
 * aStruct.c
 */
#include <stdio.h>
#include "smallerStruct.h"
#include "aStruct.h"

aStruct createStruct() {
    aStruct asOutput;

    printf("This makes sure that this code depends on stdio.h, just to make sure I know where the inclusion directive should go (main.c or aStruct.c).\n");

    asOutput.value1 = 5;
    asOutput.value2 = 5;
    asOutput.ssTest = createSmallerStruct();

    return asOutput;
}

/*
 * smallerStruct.c
 */
#include <stdio.h>
#include "smallerStruct.h"

smallerStruct createSmallerStruct() {
    smallerStruct ssOutput;
    ssOutput.value3 = 41;
    return ssOutput;
}

Esto genera los siguientes mensajes de error:

  

A aStruct.h: 10

     
      
  • campo 'ssTest' tiene tipo incompleto
  •   
     

A main.c: 8

     
      
  • variables sin usar `asTest' (éste tiene sentido)
  •   
¿Fue útil?

Solución

El problema de definición múltiple es más probable que proviene de la forma en que está incluido el código. Está utilizando #include "aStruct.c" en lugar de # include "aStruct.h". Sospecho que también está compilando los archivos .c en su proyecto, además de la # include. Esto hace que el compilador se confunden debido a las múltiples definiciones de la misma función.

Si cambia el # include # include a "aStruct.h" y asegúrese de que los tres archivos de código fuente se compilan y unidos entre sí, el error debe desaparecer.

Otros consejos

La base de la inclusión es asegurarse de que sus cabeceras se incluyen sólo una vez. Esto se realiza generalmente con una secuencia como ésta:

/* header.h */
#ifndef header_h_
#define header_h_

/* Your code here ... */

#endif /* header_h_ */

El segundo punto es cuidar de posibles conflictos de nombre por la manipulación manual de seudo espacios de nombres con prefijos.

A continuación, poner en sus cabeceras única función declaraciones de API pública. Esto puede implicar añadir typedefs y enumeraciones. Evitar en lo posible la inclusión constante y declaraciones de variables:. Descriptor de acceso prefieren funciones

Otra regla es que nunca incluyen archivos .c, solamente .h. Este es el punto de modularidad:. Un módulo dado depende de otro módulo únicamente tiene que saber su interfaz, no su aplicación

A para su problema específico, usos aStruct.h struct smallerStruct pero no sabe nada al respecto, en particular, su tamaño por ser capaz de asignar una variable aStruct. aStruct.h necesita incluir smallerStruct.h. Incluyendo smallerStruct.h antes aStruct.h en main.c no resuelve el problema al compilar aStruct.c.

Estos errores significan que declaración de la función (tipo de retorno o parámetro de conteo / tipos) difiere de otras declaraciones de función o definición de la función.

Mensaje previous declaration le apunta a la declaración en conflicto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top