【问题标题】:In my code, why is lack of a function declaration a non-issue for one function, but throws a warning for another?在我的代码中,为什么缺少函数声明对于一个函数来说不是问题,但会引发另一个函数的警告?
【发布时间】:2013-04-02 04:37:30
【问题描述】:

在下面的程序中,我使用了两个函数 prd() 和 display()。在 main() 中调用它们之前,我没有在 main() 之前声明它们,并且我在 main() 之后定义了它们。然而虽然 prd() 在 main() 中工作顺利,但调用 display() 会显示警告“先前隐式声明 'display' 在这里”。 display() 有什么不同之处在于它有一个警告但其他功能没有prd()?我一开始都没有声明它们。由于调用一个,仍然有警告,但另一个工作正常。

    #include<stdio.h>

    int main()
    {
        int x=8,y=11;

        printf("The product of %d & %d is %d",x,y,prd(x,y));

        display();

        return 0;
    }

    int prd(int x,int y)
    {
        return x*y;
    }

    void display()
    {
        printf("\n Good Morning");
    }

PS:如果您能回答这个次要问题,我将不胜感激——“函数声明在 C 中是否根本不需要,只要有定义吗?”。我有声明程序的所有函数的习惯在 main() 函数之前,然后在 main() 函数之后定义它们。我错了吗?

【问题讨论】:

  • 旁注:int main()NOT 在 C 中提供原型的正确声明(与 C++ 不同)。它是老式的、已弃用的 K&R 风格,表示 main 采用未指定但固定数量的参数。暂时使用int main(void),直到永远。
  • 哦,我一定会记住这一点的。我之前曾被警告过,但由于我的编译器从来没有遇到过问题,所以我没有打扰。如果我使用某些东西会遇到问题已弃用?它会在代码块的 C99 模式下显示错误/警告吗?
  • @Jens 在你发表评论之前我已经给你发了消息。这是关于我的另一个问题,你回答的关于递归的问题。我想知道是否可以表达任何像 x^23 这样的数字作为 x^16 * x^4 * x^2 * x^1 (每个幂都是前幂的平方根,直到它是 1)。我理解你的公式,但另一个用户 Cobbal 有这个公式。
  • 你会收到int main() 的警告,gcc -Wstrict-prototypeswarning: function declaration isn’t a prototype。添加-Werror 会将其变为错误。
  • @Jens 我很不幸我不熟悉 Linux 和从命令提示符编译。所以请简明扼要地告诉我,如果“-Werro”是我们可以在使用 gcc 编译时添加的选项命令提示符?是吗?它是什么意思?简而言之,什么是gcc-Wstrict-prototypes?我什至不知道这么多,我感到很痛苦。

标签: c


【解决方案1】:

当您使用未声明的 display() 时,编译器会隐式声明它,就好像它正在返回 int

当编译器最终看到display()的定义时,它看到返回类型是void,但它已经假定它是int,所以定义和隐式声明不同,因此错误/警告.

【讨论】:

    【解决方案2】:

    发生该错误是因为 C 考虑了所有返回类型为 int 的未启动函数。您的 display 函数稍后会使用 void 返回类型定义。

    display() 的返回类型更改为int 会删除警告。

    【讨论】:

      【解决方案3】:

      默认情况下,编译器假定未声明的函数返回int

      这适用于您的 prd 函数,但它与 display()void 不匹配。这会导致编译器发出警告。

      第二,声明函数总是合适的。

      【讨论】:

        猜你喜欢
        • 2021-05-03
        • 1970-01-01
        • 2019-01-20
        • 1970-01-01
        • 2012-10-28
        • 1970-01-01
        • 2021-09-05
        • 2011-12-02
        • 2016-03-13
        相关资源
        最近更新 更多