我遇到了错误

警告:函数'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;
}

最佳答案

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

让我们看一下警告:



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

这里:

minVal = Min(x, y, z);

因此,您需要编写一个称为Min的函数,或者需要用已经声明的某个函数替换Min。例如,
void minVal (double x, double y, double z, double minVal)

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

此函数返回void,并且您尝试确定以double作为数据类型的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。请注意,通常最好将动词/ Action 用作函数名称,以使其易于解释函数的作用。因此,如果我可以自由更改main()函数,则在所有位置(声明和函数调用)都将使用名称Get_minValue而不是Min
  • Min的返回类型更改为double,以便我可以返回值,而不是将其分配给参数。

  • 您仍然可以通过摆脱minVal变量来使它变得更好,我会让您知道:-)

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

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

    10-07 18:52