繁体   English   中英

linux上的c函数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM