简体   繁体   English

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

[英]“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 of criarFila' obj\\Debug\\filaPreferencial.o:C:/Users/wailu/workspace/AED1EP1/filaPreferencial.c:6: first defined here obj \\ Debug \\ usaFilaPreferencial.o:在函数criarFila': C:/Users/wailu/workspace/AED1EP1/filaPreferencial.c:6: multiple definition of criarFila的criarFila': C:/Users/wailu/workspace/AED1EP1/filaPreferencial.c:6: multiple definition of obj \\ Debug \\ filaPreferencial.o:C:/ Users / wailu / workspace / AED1EP1 / filaPreferencial.c:6:首先在这里定义

And it repeats for the 7 functions, reporting 15 errors and 2 warnings: 并重复执行7个功能,报告15个错误和2个警告:

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] 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:在函数“ exibirLog”:C:\\ Users \\ wailu \\ workspace \\ AED1EP1 \\ filaPreferencial.c:29:1:警告:控制到达非无效函数的结尾[-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. 我也曾尝试使用某些人在其他答案中提出的#ifndef / #define解决方案,但无济于事。

Long story short, my teacher generated three files, filaPreferencial.h, filaPreferencial.c and usaFilaPreferencial.c. 长话短说,我的老师生成了三个文件:filaPreferencial.h,filaPreferencial.c和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). 除了完成filaPreferencial.c中生成的功能存根(或在同一文件中添加辅助功能)之外,我们不应对这些文件进行任何修改。

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. 因为我对C非常不习惯,所以可能我做了一些导致这种情况的事情,但是我对它可能是个茫然。

filaPreferencial.h 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 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 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;
}

I think Bo Persson above may have the right solution for you. 我认为上述Bo Persson可能为您提供正确的解决方案。 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. 您在头文件中声明了所有函数,而所有其他源文件也需要“查看” filaPreferencial.c中定义的函数。 As such, in usaFilaPreferencial.c you should be including "filaPreferencial.h" rather than "filaPreferencial.c". 因此,在usaFilaPreferencial.c中,应包括“ filaPreferencial.h”而不是“ 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. 发生的情况是,当预处理器看到#include "filaPreferencial.c" ,它将用filaPreferencial.c的内容替换该语句。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM