Pergunta

Estou apenas começando com a programação modular em C. Acho que estou fazendo algo errado com as inclusões, porque estou recebendo muito conflicting types for 'functionName' e previous declaration of 'functionName' was here erros. Eu coloquei guardas de inclusão no lugar.

Você conhece um tutorial claro que explica a programação modular em C, especialmente como as inclusões funcionam?


Atualizar: Eu tentei isolar meu problema. Aqui está algum código, conforme solicitado.

Atualização 2: O código atualizado está abaixo. Os erros também foram atualizados.

/*
 * 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;
}

Isso gera as seguintes mensagens de erro:

ASTRUCT.H: 10

  • Campo 'Sstest' tem tipo incompleto

Em main.c: 8

  • variável não utilizada 'astest' (este faz sentido)
Foi útil?

Solução

O problema de definição múltipla provavelmente vem da maneira como você está incluindo o código. Você está usando o #include "Astruct.c" em oposição ao #include "Astruct.h". Suspeito que você também esteja compilando os arquivos .C em seu projeto, além do #include. Isso faz com que o compilador fique confuso devido às múltiplas definições da mesma função.

Se você alterar o #include para #include "Astruct.h" e verifique se os três arquivos de origem estão compilados e vinculados, o erro deve desaparecer.

Outras dicas

A base da inclusão é garantir que seus cabeçalhos estejam incluídos apenas uma vez. Isso geralmente é realizado com uma sequência como esta:

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

/* Your code here ... */

#endif /* header_h_ */

O segundo ponto é cuidar de possíveis conflitos de nome, lidando com namespaces pseudo -pseudo com prefixos.

Em seguida, coloque seus cabeçalhos apenas as declarações de API pública. Isso pode sugerir adicionar typedefs e enumes. Evite o máximo possível para incluir declarações constantes e variáveis: prefira funções de acessador.

Outra regra é nunca incluir arquivos .c, apenas .h. Esse é o ponto de modularidade: um determinado módulo dependente de outro módulo precisa apenas conhecer sua interface, não sua implementação.

A para o seu problema específico, aStruct.h usos struct smallerStruct mas não sabe nada sobre isso, em particular do seu tamanho para poder alocar um aStruct variável. aStruct.h precisa incluir smallerStruct.h. Incluindo smallerStruct.h antes da aStruct.h dentro main.c não resolve o problema ao compilar aStruct.c.

Tais erros significam que a declaração da função (tipo de retorno ou contagem/tipos de parâmetros) difere de outras declarações de função ou definição de função.

previous declaration A mensagem aponta para a declaração conflitante.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top