我有三个文件,test.c
,a.h
,a.c
。 test.c
调用在a.h
中声明的函数,a.c
定义函数。但是a.c
中的函数与返回值和参数中的a.h
不同。无论哪种情况,我的gcc
都没有警告,并且有一些结果。为什么?
在我的test.c
#include "a.h"
#include <stdio.h>
int main(){
int x = a();
printf("%d\n", x);
}
在我的a.h
int a();
在我的a.c
#include <stdio.h>
void a(int a)
{
printf("%d\n", a);
}
在我的终端:
$ gcc -o test test.c a.c // no warning
$ ./test
1
2
如果没有a.h包含在a.c中,编译器就不知道它是一个问题。因此,您根本不会遇到任何编译问题。每个人都有自己的.o文件,每个人都很开心。
编译器期望a()
返回一个int
,因此它有机器代码从堆栈中获取结果(或者可能是某些寄存器)。
编译器期望a()
有一个参数,所以它有机器代码从堆栈中获取参数(同样,可能是一个寄存器)。
然后链接器出现并将它们放在一起。它不知道有问题,但它使a()
的调用工作。
因此,您将获得寄存器(或堆栈)上遗留的值。希望您处于受保护的环境中,这样您就无法获得其他用户的信息。