【问题标题】:Why int function works even when they're not declared first in C为什么 int 函数即使没有在 C 中首先声明也能工作
【发布时间】:2021-05-17 17:02:29
【问题描述】:

我知道要使用一个函数,你必须要么在主函数之上定义它,要么至少先声明它。但是我注意到如果我的函数具有 intvoid 返回类型

,C 不会抛出错误消息
#include <stdio.h>
#include <stdlib.h>

int main()
{
    printf("Answer: %d", cube(3));
    return 0;
}

int cube(int num)
{
    return num * num * num;
}

我还是 C 的新手,你能解释一下为什么该规则不会影响 int 返回类型

【问题讨论】:

  • 这是由于向后兼容旧的 C 标准。
  • 我认为 gcc 甚至可能不会警告您main 之后的第一个函数,但尝试添加多个函数而不声明它会出错。
  • C99 之前的所有“未知”函数(即先前未声明的函数)都被自动假定为返回“int”。 gcc v5+ 将默认为 C99,但较小的版本将默认为已失效的 C90 标准。
  • 节省时间,使用现代编译器并启用所有警告以获得类似“警告:函数‘立方体’的隐式声明 [-Wimplicit-function-declaration]”的结果
  • 感谢大家的解释,是的,它确实警告我有关构建日志中的隐式函数声明。我只是不知道为什么其他返回类型显示明显错误而 int 没有,但现在我知道为什么了。

标签: c function return prototype return-type


【解决方案1】:

几十年前,函数类型默认返回int。 1990 C 标准在第 6.3.2.2 条中说:

... 如果函数调用中括号内的参数列表之前的表达式仅包含一个标识符,并且如果该标识符没有可见的声明,则该标识符被隐式声明,就好像在包含函数调用的最里面的块中,声明

extern int <em>identifier</em>();

出现了……

一些 C 编译器仍然为此做出规定,这在本世纪的价值值得怀疑。您应该要求编译器应用更现代的标准,例如使用 Clang 开关 -std=c17,以及使用 -Wmost-Wall 启用警告,除非您有机会编译超过三分之一以上的代码百年历史。

【讨论】:

  • 请不要告诉新的 C 程序员使用超一致性-std=cXX 模式。我详细介绍了为什么不in this answer-std=gnu11 -Wall -Wextra -Wpedantic 是一个更实用的设置。
  • @zwol:没有所谓的“超一致性”,使用符合标准的模式是有益的,而不是对专业软件的障碍,阻止人们使用它们是糟糕的工程。
  • @zwol:我读了你的回答。这是没有说服力的。 GCC 和 Clang 提供了在合规模式下使用它们的扩展的方法,并且良好的标头可以做到这一点,就像特征选择宏一样。对于那些不这样做的人,应该提倡让他们去做而不是容忍不合格。而且,如果有人发现自己被这些损坏的标题卡住了,他们至少可以将它们的使用隔离到一个单独的翻译单元(旨在重新导出适当的界面),而不是用它们毒害他们的整个项目。
  • 如果有 -fno-trigraphs,我可能会同情你的立场,但没有,这本身就是不使用超一致性模式的充分理由,尤其是对于初学者。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-25
  • 1970-01-01
  • 2022-10-04
相关资源
最近更新 更多