冲突类型中的C错误

时间:2013-10-07 15:56:55

标签: c compiler-errors

#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);
^

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

4 个答案:

答案 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的函数。如果您的函数实际上是以不同方式定义的,那么程序的行为是未定义的。

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