错误C2371:重新定义; 不同的基本类型 – 为什么?

我有以下代码:

#include  #include  // helping void sortint(int numbers[], int array_size) { int i, j, temp; for (i = (array_size - 1); i > 0; i--) { for (j = 1; j  numbers[j]) { temp = numbers[j-1]; numbers[j-1] = numbers[j]; numbers[j] = temp; } } } } // exer1 - A void sort(int** arr, int arrsize) { int i = 0; // sort.... for(; i < arrsize; ++i) { sortint((*(arr+i))+1, **(arr+i)); } } // Exer1 - B void print(int** arr, int arrsize) { int i = 0, j, size, *xArr; for(; i < arrsize; ++i) { size = **(arr+i); xArr = *(arr+i); printf("size: %d: ", size); // print elements for(j = 1; j <= size; ++j) printf("[%d], ", *(xArr+j)); printf("\n"); } } // Exer2: void exera() { int* ptr = (int*)malloc(sizeof(int)); if(!ptr) exit(-1); eb(ptr); free(ptr); } void eb(int* ptr) { int* arr = (int*) malloc(sizeof(int) * (*ptr)); int i = 0; for(; i < *ptr; ++i) scanf("%d", arr+i); ec(arr, *ptr); } void ec(int* arr, int size) { int i; sortint(arr, size); for(i = 0; i < size; ++i) printf("[%d], ", *(arr+i)); } int main() { // Exer1: int a[] = {4,3,9,6,7}; int b[] = {3,2,5,5}; int c[] = {1,0}; int d[] = {2,1,6}; int e[] = {5,4,5,6,2,1}; int* list[5] = {a,b,c,d,e}; sort(list, 5); // A print(list, 5); // B printf("\n\n\n\n\n"); // Exer2: exera(); fflush(stdin); getchar(); return 0; } 

我收到这些错误:

 Error 2 error C2371: 'eb' : redefinition; different basic types source.c 56 Error 4 error C2371: 'ec' : redefinition; different basic types source.c 63 Warning 1 warning C4013: 'eb' undefined; assuming extern returning int source.c 52 Warning 3 warning C4013: 'ec' undefined; assuming extern returning int source.c 60 

我试图改变function名称 – 什么也没做。

为什么会显示该错误? 我正在使用Visual C ++ Express 2010。

您在声明或定义之前尝试调用ebec 。 在exera之前移动eb之前的ec的定义。 您还可以在定义任何函数之前声明函数,如下所示:

 void eb(int* ptr) ; void ec(int* arr, int size) ; 

在声明eb之前,你从exera调用eb 。 编译器假定它将返回int然后找到一个在文件的下方返回void的实现。

最常见的修复方法是在文件的顶部声明本地函数

 void eb(int* ptr); // repeat for each other function which generates the same error 

如果你要在函数eb之后放置函数eb ,那么你需要在它被调用之前为它放置一个原型…否则,C将使用默认原型然后你的函数最终重新定义它因此你收到的错误。

或者,您可以在将源函数用于源文件之前自行移动它们,但这并不总是可行的。 将原型放置在文件的顶部,或者更好的是,在头文件中,您可以包含您将使用这些function的任何地方,这是最好的选择。