Joh*_*ozo 4 c compiler-construction makefile header
我承认,这是一个愚蠢的问题.代码会更好地解释它.得到这些文件:
你好ç:
#include <stdio.h>
void hello(char * s)
{
printf("hello, %s\n", s);
}
Run Code Online (Sandbox Code Playgroud)
main.c中:
int main()
{
hello("world!");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
生成文件:
test : main.o hello.o
gcc -o test main.o hello.o
main.o : main.c
gcc -c main.c
hello.o : hello.c
gcc -c hello.c
.PHONY : clean
clean :
-rm test
-rm main.o
-rm hello.o
Run Code Online (Sandbox Code Playgroud)
我可以"制作"和"./test"它,它的工作原理.我不应该在main.c中包含类似hello.h的东西,这样编译器才能知道函数原型吗?
我甚至没有在任何地方包含hello.c它只是工作!为什么main.c知道hello函数?
如果可行,我什么时候需要.h文件?我是C编程的新手,但我认为这个概念很容易掌握,现在我完全糊涂了.
Oli*_*rth 13
如果你使用的-Wall标志(和应该总是用它,连同-Werror -Wextra),那么你会得到以下信息:
main.c: In function 'main':
main.c:3: warning: implicit declaration of function 'hello'
Run Code Online (Sandbox Code Playgroud)
并且编译器有效地"猜测"了要做什么,这可能在许多情况下导致灾难.
正确使用头文件可以避免这种警告.
你不需要头文件;相反,您的函数需要原型。当您调用hello传递它时"world",C 会发现您正在调用一个带参数的函数char*,并正确执行所有操作。但是,如果该函数接受一个浮点数,而您决定将其设置为一个int(尝试一下,这很有启发性),这将不起作用 。出于向后兼容性的原因,C 将允许您在没有原型的情况下调用函数,但它很危险。例如,在您调用 的情况下hello,编译器认为您正在调用一个返回int. 从技术上讲,您正在调用未定义的行为,因此您的程序会意外运行。
头文件恰好提供了提供原型的最方便的方法,但您可以在代码本身中提供它们,如下所示:
void hello(char*);
int main()
{
hello("world!");
return 0;
}
Run Code Online (Sandbox Code Playgroud)