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

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

问题描述:

我有以下代码:错误C2371:重新定义;不同的基本类型 - 为什么?

#include <stdio.h> 
#include <stdlib.h> 

// helping 
void sortint(int numbers[], int array_size) 
{ 
    int i, j, temp; 

    for (i = (array_size - 1); i > 0; i--) 
    { 
    for (j = 1; j <= i; j++) 
    { 
     if (numbers[j-1] > 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 

我试图改变函数名 - 白白。

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

+0

在使用函数之前,需要原型定义或声明。 – BLUEPIXY 2013-05-07 16:42:10

您正试图在声明或定义之前调用ebec。在eb之前和exera之前移动ec的定义。

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

你很棒:)非常感谢。 – Billie 2013-05-07 16:43:21

+0

很酷。这个答案现在帮助我第二次了。 – 2018-02-26 02:08:42

你从exera调用eb,声明eb之前:您也可以向前定义之前的任何人,像这样声明的功能。编译器假定它会返回int,然后找到一个实现,该实现返回文件后面的void

最常见的解决方法是在你的文件的近顶部

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

如果你要去的地方的功能eb在它被称为后点,那么你需要的地方,声明你的本地函数一个在它被调用之前的原型...否则,C将使用默认的原型,然后你的函数将重新定义它,从而导致你收到的错误。

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