[英]Why don't I have to include my header files when compiling with GCC?
据我了解,为了使用在头文件中声明并在匹配的源文件中定义的函数,必须在main()之前包含所述头文件。 那么,为什么使用以下命令编译并运行正常:
gcc -o hello hellomain.c hello.c
hellomain.c
int main(int argc, char *argv[])
{
helloPrint();
return 0;
}
你好
#ifndef hello_h
#define hello_h
void helloPrint();
#endif
你好ç
#include <stdio.h>
void helloPrint()
{
printf("Hello, World!");
}
这显然是一个非常简化的示例,但它说明了我的问题。 为什么我不必在“ hellomain.c”中包含“ hello.h”? 谢谢!
当使用没有原型的函数时,编译器会对它的返回类型和它所使用的参数做一些假设。 在这种情况下,即使假设函数返回一个int
,这些假设也可以奏效。
正如Eric Postpischil在评论中指出的那样,强烈建议省略原型,因为它会导致细微的错误。 您应始终确保函数调用具有可用的所需原型,最好通过包括它们的相应标头来实现。
当您在C源文件中使用未声明的函数时,编译器将从调用中派生参数,并假定返回类型为int。
根据ISO标准“编程语言-C”
6.5.2.2函数调用
6如果表示被调用函数的表达式的类型不包含原型,
...
如果参数数量不等于参数数量,则行为是不确定的。
这意味着,如果您在未声明函数的情况下使用该函数,并且参数个数与该函数的实际参数个数不一致,则所有选择均无效。
...
如果使用不包含原型的类型定义函数,并且升级后的参数类型与升级后的参数类型不兼容,则行为未定义,...
同样,当您在未声明函数的情况下使用函数且参数类型与函数的实际类型不匹配时,可能会发生任何事情。
因此,尽管在某些情况下可能会起作用,但是您应该声明在程序中使用的功能。 如果您不这样做,编译器将无法帮助并检测函数声明和函数调用之间的不匹配。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.