[英]functions in c on linux
我实际上是在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()
吗? 什么是隐含声明?
如果需要,可以在main
之后放置函数; 如果你在main
调用它们,在定义它们之前,你还应该在main
之前声明它们:
void message();
void main()
...
如果没有这个编译器假定message
是一个外部链接的函数返回int
,然后当它遇到的实际定义message
它抱怨冲突的类型message
(因为它已经决定,消息返回int
,而不是void
)。
在调用之前,首先要定义或声明方法。 在下面的示例中,我在main中调用它之前声明了该方法:
#include<stdio.h>
// Declare the method
void message();
void main()
{
// Call the method
message();
printf("\nCry, and you stop the monotomy!\n");
}
// Define the method
void message()
{
printf("\nSmile, and the worldsmiles with you...");
}
PS:我会将main()
的返回类型更改为int
。 阅读更多主题()应该在C和C ++中返回main()?
当编译器到达message();
(在main中)编译器对函数message
一无所知。
它现在尽力而为。 所以它给你警告,然后假定message
应该被声明为int message();
因此,当编译器最终变为void message()
- 它说“你好 - 我认为它将是int messgae”。 因此警告。
简单地在main
之前放置任一message
,因此当它编译main
,编译器知道message
。
或者正如其他海报所说的那样。 在顶部声明它。
当我把消息函数放在main()上面时,它显示没有错误。 为什么? 我们不能把函数放在main()之后吗?
C源文件自上而下解析。 因此,当编译器看到函数调用message
(在main中)时,它必须知道它(基本上同样适用于任何符号)。 这就是为什么把它放在上面的工作,但是在下面导致诊断。
您必须至少在使用之前为任何标识符提供声明。
什么是隐含声明?
当编译器看到函数调用但不知道它时,它假定函数返回一个int
(例如int message();
)。 这是“隐含声明”。 这是一个古老的规则,有效期至C99 。
但在C99及更高版本中,此规则已被删除。 因此,您的代码(在没有声明的情况下将“message”的定义置于main之下)在C99及更高版本中无效。 请参阅C函数调用:了解“隐式int”规则 。
稍后当编译器看到message
的实际定义(即void message() {...
)时,它会看到返回类型实际上是void
。 因此,这与它自己的声明(它假定为int
)冲突。 所以它产生:
msg.c:8:6: warning: conflicting types for ‘message’
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.