我实际上是在Ubuntu 18.04上使用C语言,我没有使用任何IDE。
#include <stdio.h>
void main()
{
message();
printf("\nCry, and you stop the monotomy!\n");
}
void message()
{
printf("\nSmile, and the worldsmiles with you...");
}
当我运行这个程序时,它返回如下错误消息。
msg.c: In function ‘main’:
msg.c:5:2: warning: implicit declaration of function ‘message’ [-Wimplicit-function-declaration]
message();
^~~~~~~
msg.c: At top level:
msg.c:8:6: warning: conflicting types for ‘message’
void message()
^~~~~~~
msg.c:5:2: note: previous implicit declaration of ‘message’ was here
message();
^~~~~~~
当我把消息函数放在main()
上面的时候,它没有显示错误,为什么呢?我们不能把函数放在main()
后面吗?这里隐式声明是什么?
4条答案
按热度按时间j2qf4p5b1#
如果需要,可以将函数放在
main
之后;如果你在main
中调用它们,在它们被定义之前,你也应该在main
之前声明它们:如果没有这个,编译器会假设
message
是一个返回int
的外部链接函数,然后当它遇到message
的实际定义时,它会抱怨message
的类型冲突(因为它已经决定message
返回int
,而不是void
)。wh6knrhe2#
在调用方法之前,你首先定义或声明你的方法。在下面的例子中,我在main中调用方法之前声明了它:
PS:我会将
main()
的返回类型更改为int
。2mbi3lxu3#
当编译器到达
message();
(在main中)时,编译器对函数message
一无所知。它现在已经尽力了,所以它给你一个警告,然后假设
message
应该被声明为int message();
所以当编译器最终到达
void message()
时-它会说“你好-我以为它会是int messgae”。只需将
message
放在main
之前,这样当编译main
时,编译器就知道message
。或者像其他海报上说的那样。在顶部声明。
z9smfwbn4#
当我把消息函数放在main()上面时,它没有显示任何错误。为什么?我们不能把函数放在main()后面吗?
C源文件是自上而下解析的,所以当编译器看到函数调用
message
(在main中)时,它必须知道它(基本上,这同样适用于任何符号),这就是为什么把它放在上面工作,而放在下面导致诊断。在使用任何标识符之前,至少必须为其提供声明。
这里的隐式声明是什么?
当编译器看到一个函数调用而不知道它的时候,它会假设这个函数返回一个
int
(比如int message();
)。这就是“隐式声明”。这是一个古老的规则,在C99之前一直有效。但是在C99和更高版本中,这个规则已经被删除了,因此你的代码(把“message”的定义放在main下面,没有声明)在C99和更高版本中是无效的,参见C function calls: Understanding the "implicit int" rule。
稍后当编译器看到
message
的实际定义(即void message() {...
)时,它看到返回类型实际上是void
,因此这与它自己的声明冲突(在那里它假定了int
),所以它生成: