【问题标题】:implicit declaration of function that should not be?不应该的函数的隐式声明?
【发布时间】:2019-07-11 20:20:26
【问题描述】:

我正在使用结构和 typedef 以及在本地工作的外部文件,但在自动检查器上我得到函数“gcd”的隐式声明

此代码由几个函数组成,它们执行返回和等基本操作。交给我们的函数 gcd 计算最大公约数,这两个代码/sn-ps 都#included 在不同的 main 中。 C: #include "fraction.h"#include "fraction.c"

/* Reduce fraction */
void reduceFraction(Fraction *val) {
    unsigned int fr = gcd(val->numerator, val->denominator);
    val->numerator = val->numerator / fr;
    val->denominator = val->denominator / fr;
}

这就是有效的 gcd

unsigned int gcd(unsigned int u, unsigned int v)
{
    // simple cases (termination)
    if (u == v)
        return u;

    if (u == 0)
        return v;

    if (v == 0)
        return u;

    // look for factors of 2
    if (~u & 1) // u is even
    {
        if (v & 1) // v is odd
            return gcd(u >> 1, v);
        else // both u and v are even
            return gcd(u >> 1, v >> 1) << 1;
    }

    if (~v & 1) // u is odd, v is even
        return gcd(u, v >> 1);

    // reduce larger argument
    if (u > v)
        return gcd((u - v) >> 1, v);

    return gcd((v - u) >> 1, u);
}

出现的错误是: 函数‘gcd’的隐式声明[-Wimplicit-function-declaration]

【问题讨论】:

  • gcdreduceFraction 内部被调用。在reduceFraction 的定义之前是否有gcd 的声明?
  • @Angew 可能是我误解了你的问题,但就我返回给检查器的代码而言,没有。 gcd 函数只在reduceFraction 中使用,在主函数中如何调用我不知道,这就是自动检查器
  • C 语言是在编译器对输入文件进行多次传递的成本很高的时候创建的,因此它希望您在使用每个函数之前完成描述每个函数的工作,或者将它们放入正确的顺序或使用原型。
  • @vNdong 这就是问题所在,那么,当您调用一个未声明的函数时(因此,正如警告所说,您依赖于它的隐式声明)。 IronMan's answer 也解释了。
  • 这是 GCD 的一种非正统算法——欧几里德早在公元前 300 年就发现或发明了一种更好的算法。

标签: c typedef


【解决方案1】:

警告告诉您该函数在使用之前未声明。该函数将假定返回一个 int,对参数的类型或数量没有限制。您可以通过在包含的头文件或更早的模块中声明该函数来消除此警告并对该函数进行更好的类型检查:

unsigned int gcd(unsigned int u, unsigned int v);

【讨论】:

    猜你喜欢
    • 2021-01-20
    • 1970-01-01
    • 2012-03-13
    • 2022-01-16
    • 2011-10-05
    • 2013-10-28
    • 2019-07-16
    • 2017-07-16
    相关资源
    最近更新 更多