![](/img/trans.png)
[英]error C2371: 'functionname' redefinition: different basic types
[英]Error C2371: redefinition; different basic types - why?
我有以下代碼:
#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
我試圖更改 function 名稱 - 但沒有成功。
為什么顯示該錯誤? 我正在使用 Visual C++ Express 2010。
您在聲明或定義之前嘗試調用eb
和ec
。 在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
如果您沒有找到多個定義,最可能的原因可能是標頭被多次包含在內。
在這種情況下使用 header 保護宏。
#ifndef HEADER_FILE
#define HEADER_FILE
/*Content of your files*/
#endif
如果你要在調用它之后放置函數eb
,那么你需要在它被調用之前為它放置一個原型...否則,C將使用默認原型然后你的函數最終重新定義它因此你收到的錯誤。
或者,您可以在將源函數用於源文件之前自行移動它們,但這並不總是可行的。 將原型放置在文件的頂部,或者更好的是,在頭文件中,您可以包含您將使用這些功能的任何地方,這是最好的選擇。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.