如何解决'variable'的多个定义(我不使用 #include file.c 作为标头)



正如我所说,我在当前的程序中遇到了这种类型的错误(使用 CodeBlocks IDE 64 在 C 语言中工作(:

C:\msys64\mingw64\bin..\lib\gcc\x86_64-w64-mingw32\10.1.0........\x86_64-w64-mingw32\bin\ld.exe: obj\Debug\main.o:C:\Users\lgmfo\Desktop\SimpleDiet\simplediet.h|1|'matrixSize'的多重定义;obj\Debug\filesManager.o:C:/Users/lgmfo/Desktop/SimpleDiet/simplediet.h:1: 首先定义在这里|

我真的不知道到底发生了什么,因为整个代码运行良好,直到我玩了一些随机变量的值(它与头文件无关(。

我的头文件如下所示:

int matrixSize[2], nReal, nPosible;
float *targetParameters;
float **diets;
void Inspector(void);
int Combinations(int);
void MatrixSelector(int *, int, int, int);
void ViableDiets(int *, float *, int);
void NutritionPlan(void);
void GaussJordan(float matrix[][2*matrixSize[0]], float *, int);
void Menu(void);
void MergeDiets(void);
void PrintDiets(void);

正如您可能已经猜到的那样,我的程序是在单独的文件中构建的,以下是filesManager文件(这是我收到错误的文件,但我假设它们都相同(:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"simplediet.h"
void Inspector(void){
FILE *fp;
int c;
int conti = 0, contj = 0;
if((fp = fopen("TablaNutricionalPlatillos.txt","r")) == NULL){
printf("No se puede abrir el archivo %sn", "TablaNutricionalPlatillos.txt");
}
else{
while((c = getc(fp)) != EOF){
if((c == '.') && (contj == 1)){
conti++;
}
else if(c == 'n'){
contj++;
}
}
}
fclose(fp);
matrixSize[0] = conti;
matrixSize[1] = contj;
}

该消息说我多次定义变量 matrixSize,但我真的没有(基于它在发生这种情况之前工作正常的事实(,因为在simpleDiet.h文件中我只是声明变量,而不是定义它们。所以我真的不知道是什么导致了这里的问题。我认为这与实际代码无关,而是链接器或编译器(我并不是所有这些方面的专家(

谢谢

我认为这与实际代码无关,而是链接器或编译器(我并不是所有这些方面的专家(

第一条规则:在责怪工具之前,首先假设问题出在代码上。

我只是声明变量,而不是定义它们。

实际上,您正在头文件中定义变量:

int matrixSize[2], nReal, nPosible;
float *targetParameters;
float **diets;

这些在技术上是试探性的定义(因为它们没有初始化(,如果它们没有出现在其他地方,它们就会成为真正的定义。 这意味着任何包含simplediet.h的.c文件都将包含这些变量的定义,因此当您链接它们时,会出现多重定义错误。

在头文件中,将extern限定符应用于以下各项:

extern int matrixSize[2], nReal, nPosible;
extern float *targetParameters;
extern float **diets;

这使它们成为声明。 然后将定义仅添加到一个源文件中。

int matrixSize[2], nReal, nPosible;是一个暂定声明,根据 C 2018 6.9.2 2.如果这些标识符没有外部定义,则暂定声明将充当定义。

要使其成为不是定义的声明,请插入externextern int matrixSize[2], nReal, nPosible;

然后在一个源文件中提供一个定义(int matrixSize[2], nReal, nPosible;就足够了(。

最新更新