C语言 返回类型为int或void的函数可以在声明和定义之前调用吗?

7dl7o3gd  于 2023-03-22  发布在  其他
关注(0)|答案(5)|浏览(148)

我在《The C Programming Language ANSI edition by Kernighan and里奇》一书中读到,如果我在实际声明/定义一个函数之前,在另一个函数中调用一个返回类型为int或void的函数,它应该可以完美地工作。但是当我在代码块上运行它时,我仍然会得到一个警告。

#include<stdio.h>
#include<conio.h>
int main()
{
    display();
}
void display()
{
    printf("Hello World\n");
}

警告是:“显示的类型冲突”。
但如果我把程序改成:

#include<stdio.h>
#include<conio.h>
void display()
{
    printf("Hello World\n");
}
int main()
{
    display();
}

它在没有任何警告的情况下工作。为什么会这样?请帮助。

6mzjoqzu

6mzjoqzu1#

你在声明display之前调用它。当你这样做时,编译器会假设返回值的类型。它假设它是int。但是当你定义函数时,你使用了一个类型为void的返回值,这就是冲突。
很久没有人认为调用没有声明的函数是合理的了。所以,在调用函数之前声明所有的函数。最好配置你的编译器,使它拒绝调用没有声明的函数的尝试。

e5nqia27

e5nqia272#

如果你读过这本书,里面提到过函数原型减速。

#include<stdio.h>
#include<conio.h>
void display(void);  // function prototype decleration
int main()
{
    display();
}
void display()
{
    printf("Hello World\n");
}

希望这有助于始终定义一个原型。

2w3kk1z5

2w3kk1z53#

在main函数之前使用一个函数原型,如下所示:

void display();

int main()
{
    display();
}

void display()
{
    printf("Hello World\n");
}
af7jpaap

af7jpaap4#

如果在编译器还没有看到其原型时调用函数,则假定返回类型为int
但是,这个功能(称为隐式函数声明)从C99开始就被删除了,你永远不应该依赖它。
使用函数声明显然是更好的选择:

void display(void);
int main(void)
{
    display();
}
void display(void)
{
    printf("Hello World\n");
}
ej83mcc0

ej83mcc05#

默认情况下只假设int返回类型,而不是void。您必须参考更新的标准。

相关问题