为什么不';使用GCC编译时,我是否必须包含头文件?

为什么不';使用GCC编译时,我是否必须包含头文件?,c,gcc,include,C,Gcc,Include,我的理解是,为了使用在头文件中声明并在匹配的源文件中定义的函数,所述头文件必须包含在main()之前。那么,为什么使用以下命令可以很好地编译和运行: hello hellomain.c hello.c hellomain.c int main(int argc, char *argv[]) { helloPrint(); return 0; } #include <stdio.h> void helloPrint() { printf("Hello, W

我的理解是,为了使用在头文件中声明并在匹配的源文件中定义的函数,所述头文件必须包含在main()之前。那么,为什么使用以下命令可以很好地编译和运行:

hello hellomain.c hello.c

hellomain.c

int main(int argc, char *argv[])
{
    helloPrint();

    return 0;
}
#include <stdio.h>

void helloPrint()
{
    printf("Hello, World!");
}
你好。h

#ifndef hello_h
#define hello_h

void helloPrint();

#endif
hello.c

int main(int argc, char *argv[])
{
    helloPrint();

    return 0;
}
#include <stdio.h>

void helloPrint()
{
    printf("Hello, World!");
}
#包括
void helloPrint()
{
printf(“你好,世界!”);
}

这显然是一个非常简单的例子,但它说明了我的问题;为什么我不在“hellomain.c”中加上“hello.h”?谢谢

当使用没有原型的函数时,编译器会对其返回类型和参数做出某些假设。在这种情况下,这些假设恰好起作用,即使它假设函数返回一个
int



正如Eric Postdischil在评论中指出的,省略原型是非常不鼓励的,因为它可能会导致微妙的错误。您应该始终确保函数调用具有所需的原型,最好包括相应的头。

当使用没有原型的函数时,编译器会对其返回类型和所采用的参数进行某些假设。在这种情况下,这些假设恰好起作用,即使它假设函数返回一个
int



正如Eric Postdischil在评论中指出的,省略原型是非常不鼓励的,因为它可能会导致微妙的错误。您应该始终确保函数调用具有所需的原型,最好包括相应的头。

当您在C源文件中使用未声明的函数时,编译器从调用中派生参数,并假定返回类型为int

根据ISO标准“编程语言-C”

6.5.2.2函数调用
6如果表示被调用函数的表达式的类型不包含 原型,

如果参数的数量不等于参数的数量,则 行为是未定义的

这意味着,当您使用一个函数而没有声明它,并且参数的数量和函数的实际参数的数量不一致时,所有赌注都是无效的


如果使用不包含原型的类型定义函数,则 升级后的参数与升级后的参数不兼容 升级,行为未定义

另外,当您使用一个函数而没有声明它,并且参数的类型和函数的实际类型不匹配时,可能会发生任何事情


因此,尽管它在某些情况下可能有效,但您应该声明在程序中使用的函数。如果不这样做,编译器将无法帮助并检测函数声明和函数调用之间的不匹配。

当您在C源文件中使用未声明的函数时,编译器将从调用中派生参数,并假定返回类型为int

根据ISO标准“编程语言-C”

6.5.2.2函数调用
6如果表示被调用函数的表达式的类型不包含 原型,

如果参数的数量不等于参数的数量,则 行为是未定义的

这意味着,当您使用一个函数而没有声明它,并且参数的数量和函数的实际参数的数量不一致时,所有赌注都是无效的


如果使用不包含原型的类型定义函数,则 升级后的参数与升级后的参数不兼容 升级,行为未定义

另外,当您使用一个函数而没有声明它,并且参数的类型和函数的实际类型不匹配时,可能会发生任何事情


因此,尽管它在某些情况下可能有效,但您应该声明在程序中使用的函数。如果您不这样做,编译器将无法帮助您检测函数声明和函数调用之间的不匹配。

应该强调的是,这在许多情况下都不起作用,并且允许错误在编译时逃脱检测。在头中声明函数,并在定义函数的文件和使用该函数的文件中包含该头,允许在编译时捕获参数声明之间的不匹配,这样就减少了部署代码中的bug。@这是一个很好的调用。应该强调的是,这在很多情况下都不起作用,并且允许bug在编译时逃过检测。在头中声明函数并将该头包含在定义函数的文件和使用该函数的文件中,可以在编译时捕获参数声明之间的不匹配,从而减少部署代码中的错误。@EricPostpischil Good call。