据我了解,为了使用在头文件中声明并在匹配的源文件中定义的函数,必须在main()之前包含所述头文件。那么为什么以下编译和运行就好了:
gcc -o hello hellomain.c hello.c
hellomain.c
int main(int argc, char *argv[])
{
helloPrint();
return 0;
}
hello.h
#ifndef hello_h
#define hello_h
void helloPrint();
#endif
的hello.c
#include <stdio.h>
void helloPrint()
{
printf("Hello, World!");
}
这显然是一个非常简单的例子,但它说明了我的问题;为什么我不必在“hellomain.c”中包含“hello.h”?谢谢!
答案 0 :(得分:4)
当使用没有原型的函数时,编译器会对其返回类型及其所需的参数做出某些假设。在这种情况下,即使假设函数返回int
,这些假设也会起作用。
正如Eric Postpischil在评论中指出的那样,我们非常不鼓励省略原型,因为它可能导致细微的错误。您应始终确保您的函数调用具有所需的原型,最好包括相应的标题。
答案 1 :(得分:3)
当您在C源文件中使用未声明的函数时,编译器从调用中派生参数并假定返回类型为int。
根据ISO标准'编程语言 - C'
6.5.2.2函数调用
6如果表示被调用函数的表达式具有不包含a的类型 原型,
...
如果参数的数量不等于参数的数量,则 行为未定义。
这意味着,当你使用一个函数而不声明它,你的参数个数和函数的实际参数个数不一致时,所有的赌注都会被关闭。
...
如果使用不包含原型的类型定义函数,则使用类型 促销后的参数与之后的参数不兼容 促销,行为未定义,......
此外,当您使用函数而不声明它并且您的参数类型和函数的实际类型不匹配时,可能会发生任何事情。
因此,虽然它可能在某些情况下有效,但您应该声明您在程序中使用的函数。如果不这样做,编译器就无法帮助并检测函数声明和函数调用之间的不匹配。