C程序中的“X的多重定义”错误

时间:2017-10-08 18:34:52

标签: c

我已经完成了许多答案,正如您将通过对代码的修改看到的那样,但我仍然可以获得所有函数的多个定义。

错误是这样的:

  

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

1 个答案:

答案 0 :(得分:0)

我认为上面的Bo Persson可能会为您提供合适的解决方案。您在头文件中声明了所有功能,这就是您需要的所有其他源文件&#34;请参阅&#34;在filaPreferencial.c中定义的函数。因此,在chinaFilaPreferencial.c中你应该包括&#34; filaPreferencial.h&#34;而不是&#34; filaPreferencial.c&#34;。

将项目中已有的源文件包含到另一个源文件中,有效地为项目中的每个函数创建两个副本。当预处理器看到#include "filaPreferencial.c"时,它会将该语句替换为filaPreferencial.c的内容。