对外部函数的引用性声明一定要遵从原函数定义,尽管可能会通过编译,但实际使用并未遵从函数的本来意图,可能会导致意想不到的bug
函数调用的处理是在连接阶段进行的
实例分析:外部函数声明于外部文件
-----projectfolder
-----main.c
-----extern_funtion.c
main.c
/***********************************************
* main.c
***********************************************/
int fun (void);//引用性声明,同:extern int fun (void);
int main ()
{
int t ;
t = fun();
printf("%d\n",t);
system("pause");
return t;
}
extern_function.c
/***********************************************
* fun.c
***********************************************/
#include <stdio.h>
void fun (int n,int b)
{
printf("%c %d %d\n",'a',b);
}
这样的引用性声明形式能顺利通过编译吗?回答是肯定的,编译丝毫没有问题,运行结果如下:
1) 调用的时候并没有向被调用的函数传递参数,实际却有参数传入?2)被调用的函数在定义中并没有返回值,实际却有返回值?
为什么呢,这就要知道c函数的参数传递机制了
1) 调用函数时将进程栈中原本其他含义的变量当做参数传入了,
2) 返回的时候将栈中或寄存器中原本其他含义的变量当做返回值返回了
若这些参数是指针,那,太可怕了!!!!!
习惯性的做法是在定义这些外部函数的同时将这些函数的引用性声明置于对应的头文件中(定义的同时并在头文件中声明,出错概率小),当外部文件需要调用该函数时,在调用文件中包含该文件就行了