在我的 C 项目中,我收到以下错误:
error C2371: 'tDatabase' : redefinition; different basic types
db.h(7) : see declaration of 'tDatabase'
error C2223: left of '->numberOfCity' must point to struct/union
error C2198: 'calloc' : too few arguments for call
我是 C 初学者。我该如何解决这个问题?谢谢。
文件:DB.h
typedef struct Database {
int numberOfCity;
tListOfCity* list;
double **distances;
} tDatabase;
tDatabase *LoadDatabase(char* file);
文件DB.c
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "DB.h"
typedef struct Database{
int numberOfCity;
tListOfCity* list;
double** distances;
} tDatabase; //this line error C2371
tDatabase* LoadDatabase(char* file) {
FILE* fileName;
tDatabase *input;
char data[100];
int i, j, number = 0;
input = (tDatabase*) calloc(1, sizeof (tDatabase));
input->list = NULL;
fileName = fopen("file.txt", "r");
fscanf(fileName, "%d", &number);
input->numberOfCity = number;
input->distances = (double**) calloc(data->numberOfCity, sizeof (double*)); //this line Error C2223 and C2198
for (i = 0; i < input->numberOfCity; i++) {
input->distances[i] = (double*) calloc(input->numberOfCity, sizeof (double));
}
for (i = 0; i <= input->numberOfCity; i++) {
fgets(data, sizeof (data), fileName);
input->list = AddOnEnd(input->list, CreateCity(data));
}
for (i = 0; i < input->numberOfCity; i++) {
for (j = 0; j < input->numberOfCity; j++) {
fscanf(fileName, "%f", &input->distances[i][j]);
}
fclose(fileName);
return input;
}
最佳答案
从代码中删除struct Database
的定义;这就是编译器所说的“重新定义”的意思。您不需要它,因为它已经在 "DB.h"
中。 (也就是说,实际上头文件的用途是:确保使用它的所有 c 文件都使用相同的定义,而不是“私有(private)”定义。)
[旁白:另一方面,如果您希望该结构是私有(private)的,即该结构的字段只能从 "DB.c"
内访问,只需将头文件中没有结构体的 typedef "DB.h"
:
typedef struct Database tDatabase;
然后像您所做的那样在 "DB.c"
中定义带有主体的结构(但没有 typedef
):
struct Database {
int numberOfCity;
tListOfCity* list;
double **distances;
};
在这种情况下,来自外部“DB.c”
的代码可以包含 header ,但它只能使用指向tDatabase
的指针,而不获取数据。对此不透明指针的所有访问都将通过“DB.c”
中定义的方法完成。]
关于c - Visual Studio 2008 C++ 中的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20932058/