冲突类型中的C错误

#define RAND_MAX 10 #include int main() { double x; x=randRange(-1.0,1.0); printf("x value is %f::",x); return 0; } double randRange(double min, double max) { return rand() * (max - min) / RAND_MAX + min; } 

错误::以下片段是生成的错误 –

 $gcc main.c -o demo -lm -pthread -lgmp -lreadline 2>&1 main.c:11:8: error: conflicting types for 'randRange' double randRange(double min, double max) { ^ main.c:6:5: note: previous implicit declaration of 'randRange' was here x=randRange(-1.0,1.0); ^ 

冲突类型出错?我检查了返回类型。

您需要在调用它的位置上方声明该函数。

 double randRange(double min, double max); int main() { double x; x=randRange(-1.0,1.0); ... double randRange(double min, double max) { 

如果不这样做,ansi C会为返回int的函数提供隐式声明

这是因为你在定义之前使用randRange 。 将定义移动到您使用它的上方,或者之前创建原型(声明)。

调用它们时未声明的函数默认返回int 。 此默认声明是错误消息中“隐式声明”的含义。

你的randRange隐式声明将randRange声明为int (*)(float, float)

始终预先声明函数以避免此类错误。 刚刚放

 double randRange(double min, double max); 

在你的main之上。

您必须使用“旧”C编译器(或以“旧”C89 / 90模式运行现代编译器)。 在兼容的现代C编译器(C99及更高版本)中,在第一次调用randRange ,您的代码通常甚至无法编译,因为您在声明之前尝试使用randRange函数。 这在现代C中是非法的。

在旧C(C89 / 90)中调用未声明的函数是合法的。 尝试将randRange作为randRange(-1.0,1.0)调用使得编译隐式地得出结论,它必须是一个具有两个double参数并返回int的函数。 如果您的函数实际上是以不同方式定义的,那么程序的行为是不确定的。

这正是你案件中发生的事情。 除了你的编译器决定“加倍努力”并报告一个带有这种隐式声明冲突的函数的错误(而不是悄悄地生成一个行为未定义的程序)。