警告:函数'Min'的隐式声明在C99中无效[-Wimplicit-function-declaration]

时间:2018-08-13 08:45:58

标签: c compiler-errors c99

我遇到错误

警告:函数Min的隐式声明在C99中无效[-Wimplicit-function-declaration]

在不触摸主电源的情况下尝试从3个输入中找到最小值的情况。

#include <stdio.h>

void minVal (double x, double y, double z, double minVal)
{
    if (x<y && x<z)
        minVal = x;

    else if (y<x && y<z)
        minVal = y;

    else if (z<x && z<y)
        minVal = z;
}

int main(void) {
    double x, y, z, minVal;

    printf("Please enter three numeric values: ");
    scanf("%lf%lf%lf", &x, &y, &z);
    minVal = Min(x, y, z);
    printf("Min(%0.10f, %0.10f, %0.10f) = %0.10f\n", x, y, z, minVal);

    return 0;
}

4 个答案:

答案 0 :(得分:3)

当您的老师召集一位缺席的学生时,所有学生可能会大喊“他不在这里!”

让我们看看警告:

  

警告:函数'Min'的隐式声明在C99 [-Wimplicit-function-declaration]中无效

这意味着您正在尝试使用Min而不在代码中声明它,这是不允许的。 这不是错误,而是警告,最终将导致链接器错误。

这里:

minVal = Min(x, y, z);

因此,您需要编写一个名为Min的函数,或者需要用已经声明的某个函数替换Min。例如,

void minVal (double x, double y, double z, double minVal)

现在,即使您将通话从Min更改为minVal,也无法使用。因为您的代码具有名为minVal的函数和具有相同名称的变量。那是混乱的。养成不要使用相同名称声明变量和函数的方法。

此函数返回void,并且您尝试确定以double作为数据类型的3个输入中的最小值,并将值分配给作为参数传递的最后一个变量。可以,但与返回值相比不方便,对吧?

  

在不触摸主电源的情况下尝试从3个输入中找到最小值的情况。

我建议这样:

#include <stdio.h>

double Min(double x, double y, double z)
{
    if (x<y && x<z)
        return x;
    else if (y<x && y<z)
        return y;
    else if (z<x && z<y)
        return z;
    else
        return 0.0;
}

int main(void)
{
    double x, y, z, minVal = 0.0;

    printf("Please enter three numeric values: ");
    scanf("%lf%lf%lf", &x, &y, &z);
    minVal = Min(x, y, z);
    printf("Min(%0.10f, %0.10f, %0.10f) = %0.10f\n", x, y, z, minVal);

    return 0;
}

此代码对您的代码进行了以下更改:

  • 函数已从Min重命名为minVal。请注意,通常最好将动词/动作用作函数名称,以使其易于解释函数的作用。因此,如果我有更改main()函数的自由,我将在所有地方(声明和函数调用)使用名称Get_minValue而不是Min
  • Min的返回类型更改为double,以便我可以返回值而不是将其分配给参数。

您仍然可以通过删除minVal变量来使它更好,我会让您弄清楚:-)

另外,C99很旧,下次您编译代码时,请确保使用-std=c11 -pedantic-errors对其进行编译。

Here,您可以找到有关编译器选项的更多信息。

答案 1 :(得分:0)

如消息所示,这是警告,不是错误。

您看到此消息是因为您正在调用函数Min,该函数未在任何地方声明。虽然编译将成功(带有警告),但是由于未定义Min,因此链接可能会失败。

您可能要调用的函数在代码中被命名为minVal,而不是Min

但是,您不能像现在这样从minVal调用main,因为您还定义了一个名为minVal的局部变量,该变量遮盖了函数名。要解决此问题,您必须重命名此变量:

double min;
...
min = minVal(x, y, z);

或者,重命名该函数:

void Min(double x, double y, double z, double minVal)
...

这将导致更多错误:

  • 您的minVal函数不返回值(其返回类型为void)。
  • 您的minVal函数使用4个参数,而不是3个参数(但它忽略了第4个参数)。

最后一点值得进一步关注。在C函数中,参数是按值传递的,所以

f(x);

无法修改x。同样,在minVal中,最后一个参数(也称为minVal)只是该参数的本地副本,因此对其赋值不会影响该函数。

您应该删除minVal参数和return一个值。

答案 2 :(得分:0)

简单:C语言不允许您调用未定义的函数(或宏)。在1999年用C语言进行了更改,这就是为什么它说“ C99”的原因。

为了解决此问题,您必须提供函数Min。就是这样。

答案 3 :(得分:0)

您的问题已得到正确回答,想对使用void函数添加评论。

void minVal (double x, double y, double z, double minVal)

minVal最有可能返回最小值。在只有一个返回值的这个简单函数中,最佳选择的确是将代码更改为:

double minVal (double x, double y, double z, double minVal)

但是,如果您必须返回多个作为一个值,或者必须返回一个状态(例如,输入两个或三个相等的数字)和一个值怎么办?然后,您需要依靠按引用调用。在C语言中,指针是必经之路。

void minVal (double x, double y, double z, double* min)
{
    if (x<y && x<z)
        *min = x;

    else if (y<x && y<z)
        *min = y;

    else if (z<x && z<y)
        *min = z;
}

int main(void) {
    double x, y, z, minValue;

    printf("Please enter three numeric values: ");
    scanf("%lf%lf%lf", &x, &y, &z);
    minVal(x, y, z, &minValue);
    printf("Min(%0.10f, %0.10f, %0.10f) = %0.10f\n", x, y, z, minValue);

return 0;
}

在这种情况下,使用&minValue将minValue的地址而不是minValue的值传递给minVal函数。在minVal函数中, min表示将值存储到double指向的地址 min。