我们可以在定义之前调用函数吗?

Pan*_*ato 5 c function

#include <stdio.h>

void main()

{

    m();

}

void m()

{

    printf("hi");

}
Run Code Online (Sandbox Code Playgroud)

产量

hi

警告

main.c:11:10: warning: conflicting types for 'm' [enabled by default]
     void m()
          ^
main.c:7:9: note: previous implicit declaration of 'm' was here
         m();
         ^
Run Code Online (Sandbox Code Playgroud)

为什么这个程序成功运行,即使m()在定义之前被调用?警告的含义是什么?

Jer*_*fin 7

如果你没有在K&RC/C89中声明一个函数,它会被隐式声明为返回int.因为你的回归void是不匹配的.

如果添加原型:

void m(void);
Run Code Online (Sandbox Code Playgroud)

......在它被召唤之前,它会解决问题.


hac*_*cks 6

C89允许通过隐式转换函数的返回类型和传递给它的参数来实现int.看到这里.

但是,这在C99及更高版本中无效.标准中省略了这一点.您必须为您的函数声明原型或之前定义它main.在这里查看结果.在这种情况下存在编译时错误.


Jua*_*rez 5

不,但你可以声明它:

#include <stdio.h>

// declare m()
void m();

void main()
{
    // use m()
    m();
}

// define m()
void m()
{
    printf("hi");
}
Run Code Online (Sandbox Code Playgroud)