我已经完成了许多答案,正如您将通过对代码的修改看到的那样,但我仍然可以获得所有函数的多个定义。
错误是这样的:
obj \ Debug \ usaFilaPreferencial.o:在函数
criarFila': C:/Users/wailu/workspace/AED1EP1/filaPreferencial.c:6: multiple definition of
criarFila'中 OBJ \调试\ filaPreferencial.o:C:/Users/wailu/workspace/AED1EP1/filaPreferencial.c:6: 首先在这里定义
它重复了7个功能,报告了15个错误和2个警告:
mingw32-gcc.exe -Wall -g -c C:\ Users \ wailu \ workspace \ AED1EP1 \ filaPreferencial.c -o OBJ \调试\ filaPreferencial.o C:\ Users \ wailu \ workspace \ AED1EP1 \ filaPreferencial.c:在功能中 'exibirLog':C:\ Users \ wailu \ workspace \ AED1EP1 \ filaPreferencial.c:29:1: 警告:控制到达非空函数的末尾[-Wreturn-type]
我已经检查过,函数似乎只在头文件中定义一次,然后在包含所述头文件的类中实现,最后在包含第一个(不是头文件)的第二个类中调用。
我也尝试过使用其他人提出的#ifndef / #define
解决方案,但无济于事。
长话短说,我的老师生成了三个文件,filaPreferencial.h,filaPreferencial.c和usaFilaPreferencial.c。除了完成在filaPreferencial.c中生成的函数存根(或在同一文件中添加辅助函数)之外,我们不应对这些文件进行任何修改。
因为我很不习惯C,所以我可能已经做了一些导致这种情况的事情,但我对它可能是什么感到茫然。
filaPreferencial.h
#ifndef __FILAPREFERENCIAL_H__ //not present in the original code.
#define __FILAPREFERENCIAL_H__ //not present in the original code.
#include <stdlib.h>
#include <stdio.h>
#define true 1
#define false 0
typedef int bool;
typedef struct aux {
...
} REGISTRO, * PONT;
typedef struct {
...
} FILAPREFERENCIAL, * PFILA;
PFILA criarFila();
int tamanho(PFILA f);
bool inserirElemento(PFILA f, int id, int idade);
PONT removerElementoFila(PFILA f);
PONT removerElementoIdade(PFILA f);
bool consultarIdade(PFILA f, int id, int* resposta);
#endif // __FILAPREFERENCIAL_H__ //not present in the original code.
filaPreferencial.c
#ifndef __FILAPREFERENCIAL_C__ //not present in the original code.
#define __FILAPREFERENCIAL_C__ //not present in the original code.
#include "filaPreferencial.h"
PFILA criarFila(){
...
}
bool exibirLog(PFILA f){
...
}
bool consultarIdade(PFILA f, int id, int* resposta){
...
}
int tamanho(PFILA f){
...
}
bool inserirElemento(PFILA f, int id, int idade){
...
}
PONT removerElementoIdade(PFILA f){
...
}
PONT removerElementoFila(PFILA f){
...
}
#endif // __FILAPREFERENCIAL_C__ //not present in the original code.
usaFilaPreferencial.c
#include "filaPreferencial.c"
int main() {
PFILA f = criarFila();
PONT prioritario;
int idade;
int id;
exibirLog(f);
if(inserirElemento(f, 20, 21)) printf("ok\n");
else printf("nok (1)\n");
exibirLog(f);
if(inserirElemento(f, 30, 23)) printf("ok\n");
else printf("nok (2)\n");
exibirLog(f);
if(inserirElemento(f, 22, 22)) printf("ok\n");
else printf("nok (3)\n");
exibirLog(f);
if(inserirElemento(f, 5, 20)) printf("ok\n");
else printf("nok (4)\n");
exibirLog(f);
if(inserirElemento(f, 50, 25)) printf("ok\n");
else printf("nok (5)\n");
exibirLog(f);
if(inserirElemento(f, 50, 25)) printf("ok\n");
else printf("ok (6) - registro repetido\n");
exibirLog(f);
if(inserirElemento(f, 5, 20)) printf("ok\n");
else printf("ok (7) - registro repetido\n");
exibirLog(f);
if(inserirElemento(f, 20, 21)) printf("ok\n");
else printf("ok (8) - registro repetido\n");
exibirLog(f);
printf("################# REMOVENDO #######################\n");
prioritario = removerElementoFila(f);
if (prioritario) printf("Primeiro: %i, %i\n", prioritario->id, prioritario->idade);
else printf("Fila vazia (1)\n");
exibirLog(f);
prioritario = removerElementoFila(f);
if (prioritario) printf("Primeiro: %i, %i\n", prioritario->id, prioritario->idade);
else printf("Fila vazia (2)\n");
exibirLog(f);
prioritario = removerElementoFila(f);
if (prioritario) printf("Primeiro: %i, %i\n", prioritario->id, prioritario->idade);
else printf("Fila vazia (3)\n");
exibirLog(f);
prioritario = removerElementoFila(f);
if (prioritario) printf("Primeiro: %i, %i\n", prioritario->id, prioritario->idade);
else printf("Fila vazia (4)\n");
exibirLog(f);
prioritario = removerElementoFila(f);
if (prioritario) printf("Primeiro: %i, %i\n", prioritario->id, prioritario->idade);
else printf("Fila vazia (5)\n");
exibirLog(f);
prioritario = removerElementoFila(f);
if (prioritario) printf("Primeiro: %i, %i\n", prioritario->id, prioritario->idade);
else printf("Fila vazia (6)\n");
exibirLog(f);
prioritario = removerElementoIdade(f);
printf("################# INSERINDO NOVAMENTE #############\n");
if(inserirElemento(f, 6, 1)) printf("ok\n");
else printf("nok (9)\n");
exibirLog(f);
if(inserirElemento(f, 8, 3)) printf("ok\n");
else printf("nok (10)\n");
exibirLog(f);
if(inserirElemento(f, 7, 2)) printf("ok\n");
else printf("nok (11)\n");
exibirLog(f);
if(inserirElemento(f, 5, 1)) printf("ok\n");
else printf("nok (12)\n");
exibirLog(f);
if(inserirElemento(f, 10, 5)) printf("ok\n");
else printf("nok (13)\n");
exibirLog(f);
if(inserirElemento(f, 10, 5)) printf("ok\n");
else printf("nok (14)\n");
exibirLog(f);
printf("################# REMOVENDO NOVAMENTE #############\n");
prioritario = removerElementoIdade(f);
if (prioritario) printf("Prioritario: %i, %i\n", prioritario->id, prioritario->idade);
else printf("Fila vazia (7)\n");
exibirLog(f);
prioritario = removerElementoIdade(f);
if (prioritario) printf("Prioritario: %i, %i\n", prioritario->id, prioritario->idade);
else printf("Fila vazia (8)\n");
exibirLog(f);
prioritario = removerElementoIdade(f);
if (prioritario) printf("Prioritario: %i, %i\n", prioritario->id, prioritario->idade);
else printf("Fila vazia (9)\n");
exibirLog(f);
prioritario = removerElementoIdade(f);
if (prioritario) printf("Prioritario: %i, %i\n", prioritario->id, prioritario->idade);
else printf("Fila vazia (10)\n");
exibirLog(f);
prioritario = removerElementoIdade(f);
if (prioritario) printf("Prioritario: %i, %i\n", prioritario->id, prioritario->idade);
else printf("Fila vazia (11)\n");
exibirLog(f);
prioritario = removerElementoIdade(f);
if (prioritario) printf("Prioritario: %i, %i\n", prioritario->id, prioritario->idade);
else printf("Fila vazia (12)\n");
exibirLog(f);
prioritario = removerElementoIdade(f);
if (prioritario) printf("Prioritario: %i, %i\n", prioritario->id, prioritario->idade);
else printf("Fila vazia (13)\n");
exibirLog(f);
printf("################# OUTROS TESTES ###################\n");
if(inserirElemento(f, 50, 20)) printf("ok\n");
else printf("nok (15)\n");
exibirLog(f);
if(inserirElemento(f, 60, 60)) printf("ok\n");
else printf("nok (10)\n");
exibirLog(f);
if(inserirElemento(f, 70, 15)) printf("ok\n");
else printf("nok (11)\n");
exibirLog(f);
if(inserirElemento(f, 80, 70)) printf("ok\n");
else printf("nok (11)\n");
exibirLog(f);
id = 50;
if (consultarIdade(f,id,&idade)) printf("Elemento encontrado: %i, %i\n", id, idade);
else printf("Elemento com identificador: %i nao encontrado\n", id);
id = 40;
if (consultarIdade(f,id,&idade)) printf("Elemento encontrado: %i, %i\n", id, idade);
else printf("ok Elemento com identificador: %i nao encontrado\n", id);
id = 80;
if (consultarIdade(f,id,&idade)) printf("Elemento encontrado: %i, %i\n", id, idade);
else printf("Elemento com identificador: %i nao encontrado\n", id);
prioritario = removerElementoFila(f);
if (prioritario) printf("Primeiro: %i, %i\n", prioritario->id, prioritario->idade);
else printf("Fila vazia (14)\n");
exibirLog(f);
prioritario = removerElementoIdade(f);
if (prioritario) printf("Prioritario: %i, %i\n", prioritario->id, prioritario->idade);
else printf("Fila vazia (15)\n");
exibirLog(f);
prioritario = removerElementoFila(f);
if (prioritario) printf("Primeiro: %i, %i\n", prioritario->id, prioritario->idade);
else printf("Fila vazia (16)\n");
exibirLog(f);
prioritario = removerElementoIdade(f);
if (prioritario) printf("Prioritario: %i, %i\n", prioritario->id, prioritario->idade);
else printf("Fila vazia (17)\n");
exibirLog(f);
return 0;
}
答案 0 :(得分:0)
我认为上面的Bo Persson可能会为您提供合适的解决方案。您在头文件中声明了所有功能,这就是您需要的所有其他源文件&#34;请参阅&#34;在filaPreferencial.c中定义的函数。因此,在chinaFilaPreferencial.c中你应该包括&#34; filaPreferencial.h&#34;而不是&#34; filaPreferencial.c&#34;。
将项目中已有的源文件包含到另一个源文件中,有效地为项目中的每个函数创建两个副本。当预处理器看到#include "filaPreferencial.c"
时,它会将该语句替换为filaPreferencial.c的内容。