Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么int函数即使在';在C中,re不是第一个声明的_C_Function_Return_Prototype_Return Type - Fatal编程技术网

为什么int函数即使在';在C中,re不是第一个声明的

为什么int函数即使在';在C中,re不是第一个声明的,c,function,return,prototype,return-type,C,Function,Return,Prototype,Return Type,我知道为了使用一个函数,你必须在主函数上面定义它,或者至少先声明它。然而,我注意到,如果我的函数有int或void返回类型,C不会抛出错误消息 #include <stdio.h> #include <stdlib.h> int main() { printf("Answer: %d", cube(3)); return 0; } int cube(int num) { return num * num * num; }

我知道为了使用一个函数,你必须在主函数上面定义它,或者至少先声明它。然而,我注意到,如果我的函数有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;
}
#包括
#包括
int main()
{
printf(“答案:%d”,立方体(3));
返回0;
}
整数立方体(整数)
{
返回num*num*num;
}

我对C还是个新手,你能解释一下为什么这个规则不影响int返回类型吗?几十年前,函数类型默认返回一个
int
。1990年C标准在第6.3.2.2条中规定:

#include <stdio.h>
#include <stdlib.h>

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

int cube(int num)
{
    return num * num * num;
}
…如果函数调用中括号参数列表前面的表达式仅由标识符组成,并且如果此标识符没有可见的声明,则将隐式声明该标识符,就像在包含函数调用的最内层块中声明该声明一样

extern int identifier()

出现


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

这是由于与旧C标准的向后兼容性。我认为gcc甚至可能不会警告你在
main
之后的第一个函数,但尝试添加多个函数而不声明它,你将得到错误。C99之前的所有“未知”函数(即之前未声明的函数)被自动假定为返回“int”。gcc v5+将默认为C99,但较低版本将默认为失效的C90标准。节省时间,使用现代编译器并启用所有警告以获得类似“警告:函数“cube”的隐式声明[-Wimplicit函数声明]”的结果感谢大家的解释,是的,它确实警告我关于构建日志中的隐式函数声明。我只是不知道为什么其他返回类型会显示明显的错误,而int不会,但现在我知道了原因。请不要告诉新的C程序员使用hyperconformant
-std=cXX
模式。我会详细说明为什么不
-std=gnu11-Wall-Wextra-Wpedantic
是一种更为实用的设置。@zwol:没有“超性能”这样的东西,使用符合标准的模式对专业软件是有益的,而不是障碍,阻止人们使用它们是不好的工程。@zwol:我读了你的答案。这是不令人信服的。GCC和Clang提供了在一致模式下使用其扩展的方法,良好的头文件也可以这样做,就像功能选择宏一样。对于那些不这样做的人,应该鼓励他们去做,而不是容忍不符合项。而且,如果有人发现自己被这样的破头卡住了,他们至少可以将它们的使用隔离到一个单独的翻译单元(设计用于重新导出适当的接口),而不是用它们毒害整个项目。如果有
-fno trigraphs
,我可能会同情你的立场,但没有,这本身就是不使用超共振模式的充分理由,特别是对于初学者。