我有这个奇怪的事情:
在file1.c中有
extern void foo(int x, int y);
..
..
int tmp = foo(1,2);
Run Code Online (Sandbox Code Playgroud)
在项目中,我只能找到这个foo():
在file2.c中:
int foo(int x, int y, int z)
{
....
}
Run Code Online (Sandbox Code Playgroud)
在file2.h中:
int foo(int x, int y, int z);
Run Code Online (Sandbox Code Playgroud)
file2.h中没有包含file2.h(这就是为什么谁用extern写的,我猜).
这个项目编译得很好,我认为这是因为在file1.c中foo()只会在链接期间查找,我是对的吗?
但我真正的问题是:为什么联系很紧张?毕竟,没有像foo这样的函数有2个参数....而且我在c ..所以没有超载..
发生什么了 ?
因为没有重载,C编译器不会修饰函数名称.链接器在file2.c对函数的引用foo中file1.c找到并在其中找到一个函数foo.它无法知道它们的参数列表不匹配并乐于使用它们.
当然,当函数foo运行时,值为zgarbage,并且程序的行为从那时起变得不可预测.