为什么这个"隐含声明函数'X'"?

0xE*_*D1E 17 c function compiler-warnings

我写了一个简单的程序来查找3个数字的Sum,average,maximum和最小数.它允许用户输入三个(整数)数字并返回总和,平均值,最大值和最小值.它没有错误,只有警告.这是我的源代码:

main.c中:

#include <stdio.h>

int main()
{
    int num1, num2, num3, sum, max, min, avg;

    printf("Enter Three \"Integer\" Numbers:");

    scanf("%i%i%i", &num1, &num2, &num3);

    sum = summation(&num1, &num2, &num3);
    avg = average(&sum);
    max = max_val(&num1, &num2, &num3);
    min = min_val(&num1, &num2, &num3);

    printf("Sum: %i Avg: %i MAX: %i MIN: %i", sum, avg, max, min);

    return 0;
}

int summation(int *n1, int *n2, int *n3)
{
    int s;
    s = *n1 + *n2 + *n3;

    return s;
}

int average(int *s)
{
    int a;
    a = *s / 3;

    return a;
}

int max_val(int *n1, int *n2, int *n3)
{
    int MAX;

    if (*n1 > *n2) MAX = *n1;
    else if (*n2 > *n3) MAX = *n2;
    else MAX = *n3;

    return MAX;
}

int min_val(int *n1, int *n2, int *n3)
{
    int MIN;

    if (*n1 < *n2) MIN = *n1;
    else if (*n2 < *n3) MIN = *n2;
    else MIN = *n3;

    return MIN;
}
Run Code Online (Sandbox Code Playgroud)

我认为不需要创建头文件,因为所有函数都是"int"类型.

当我编译这个

gcc main.c -o test
Run Code Online (Sandbox Code Playgroud)

它说

main.c: In function 'main':
main.c:34:5: warning: implicit declaration of function 'summation' [-Wimplicit-function-declaration]
Run Code Online (Sandbox Code Playgroud)

为什么这个警告?我在该声明中找不到任何错误.那是什么?

pb2*_*b2q 34

summation并且你的其他函数在使用之后就被定义了main,所以编译器已经猜到了它的签名; 换句话说,假设了一个隐含的声明.

您应该在使用之前声明该函数并删除警告.在C99规范中,这是一个错误.

要么之前 移动函数体main,要么包括方法签名main,例如:

#include <stdio.h>

int summation(int *, int *, int *);

int main()
{
    // ...
Run Code Online (Sandbox Code Playgroud)

  • 在1990版本的C标准中,有一个隐式声明,假定函数返回`int`.在1999年及以后的版本中,没有"隐含的"规则; 调用没有可见声明的函数是违反约束的. (3认同)
  • @ 0xEDD1E更具体地说,它就像一本书.你从上到下阅读.如果您在顶部之前阅读底部,则您无法理解该情节.C和C++程序也是如此.在使用之前必须确定所有内容......变量,函数,结构,枚举等. (2认同)