"Multiple definition of X" error in C program

I've been through many of the answers, as you'll see by the modifications to the code, but I'm still getting multiple definitions for all of the functions.

The error is this:

obj\Debug\usaFilaPreferencial.o: In function criarFila': C:/Users/wailu/workspace/AED1EP1/filaPreferencial.c:6: multiple definition ofcriarFila' obj\Debug\filaPreferencial.o:C:/Users/wailu/workspace/AED1EP1/filaPreferencial.c:6: first defined here

And it repeats for the 7 functions, reporting 15 errors and 2 warnings:

mingw32-gcc.exe -Wall -g -c C:\Users\wailu\workspace\AED1EP1\filaPreferencial.c -o obj\Debug\filaPreferencial.o C:\Users\wailu\workspace\AED1EP1\filaPreferencial.c: In function 'exibirLog': C:\Users\wailu\workspace\AED1EP1\filaPreferencial.c:29:1: warning: control reaches end of non-void function [-Wreturn-type]

I've checked and the functions appear to only be defined once in the header, then implemented in a class that includes said header and finally called in a second class that includes the first one (not the header).

I've also tried to use the #ifndef / #define solution some people proposed in other answers, to no avail.

Long story short, my teacher generated three files, filaPreferencial.h, filaPreferencial.c and usaFilaPreferencial.c. We're not supposed to make any modifications to these files, except completing the function stubs generated in filaPreferencial.c (or adding auxiliary functions in this same file).

As I'm very unused to C, it's possible I've done something that's causing this, but I'm at a loss as to what it could be.

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

Upvotes: 0

Views: 1459

Answers (1)

Nik
Nik

Reputation: 1870

I think Bo Persson above may have the right solution for you. You declared all your functions in the header file, and that is all your other source files need to "see" the functions defined in filaPreferencial.c. As such, in usaFilaPreferencial.c you should be including "filaPreferencial.h" rather than "filaPreferencial.c".

Including a source file that is already in the project into another source file, effectively creates two copies of every function in the project. What happens is that when the preprocessor sees #include "filaPreferencial.c", it replaces that statement with the contents of filaPreferencial.c.

Upvotes: 1

Related Questions