C语言 为什么编译器不能识别void message()函数?

muk1a3rh  于 2023-02-03  发布在  其他
关注(0)|答案(4)|浏览(155)

我实际上是在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()后面吗?这里隐式声明是什么?

46scxncf

46scxncf1#

如果需要,可以将函数放在main之后;如果你在main中调用它们,在它们被定义之前,你也应该在main之前声明它们:

void message();
void main()
...

如果没有这个,编译器会假设message是一个返回int的外部链接函数,然后当它遇到message的实际定义时,它会抱怨message的类型冲突(因为它已经决定message返回int,而不是void)。

a0zr77ik

a0zr77ik2#

在调用方法之前,你首先定义或声明你的方法。在下面的例子中,我在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

qij5mzcb

qij5mzcb3#

当编译器到达message();(在main中)时,编译器对函数message一无所知。
它现在已经尽力了,所以它给你一个警告,然后假设message应该被声明为int message();
所以当编译器最终到达void message()时-它会说“你好-我以为它会是int messgae”。
只需将message放在main之前,这样当编译main时,编译器就知道message
或者像其他海报上说的那样。在顶部声明。

mtb9vblg

mtb9vblg4#

当我把消息函数放在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),所以它生成:

msg.c:8:6: warning: conflicting types for ‘message’

相关问题