#define RAND_MAX 10
#include<stdio.h>
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);
^
冲突类型出错?我检查了返回类型。
答案 0 :(得分:5)
您需要在函数调用点之上声明函数。
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
答案 1 :(得分:1)
这是因为您在定义之前使用randRange
。将定义移动到您使用它的上方,或者在之前创建原型(声明)。
调用它们时未声明的函数默认返回int
。此默认声明是错误消息中“隐式声明”的含义。
答案 2 :(得分:1)
您对randRange
的隐式声明将其声明为int (*)(float, float)
。
始终预先声明函数以避免此类错误。只需加上
double randRange(double min, double max);
高于main
。
答案 3 :(得分:0)
您必须使用“旧”C编译器(或以“旧”C89 / 90模式运行现代编译器)。在兼容的现代C编译器(C99及更高版本)中,在第一次调用randRange
时,您的代码通常甚至无法编译,因为您尝试使用randRange
函数之前声明。这在现代C中是非法的。
在旧C(C89 / 90)中,调用未声明的功能是合法的。尝试将randRange
调用为randRange(-1.0,1.0)
会使编译隐式地断定它必须是具有两个double
参数并返回int
的函数。如果您的函数实际上是以不同方式定义的,那么程序的行为是未定义的。
这正是你案件中发生的事情。除了你的编译器决定“加倍努力”并报告一个带有这种隐式声明冲突的函数的错误(而不是悄悄地生成一个行为未定义的程序)。