Tutorial claro explicando a programação modular em C?
-
21-09-2019 - |
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)
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.