分类: C/C++
2008-11-18 19:09:38
用extern修饰函数是表示被修饰的函数定义在当前文件外,而该函数用extern声明类型后就可以被当前文件调用了。使用extern修饰某函数时,对该函数的调用是在连接阶段才被处理的。下面我们看一段代码。
/***********************************************
* fun.c
***********************************************/
#include
void fun (int n)
{
printf("%d\n");
}
/***********************************************
* test.c
***********************************************/
extern void fun (void);
int main ()
{
fun();
return 0;
}
着两个文件能编译连接到一起吗?答案是肯定的,而且不会出现警告。那我们运行这个程序看看什么结果:
C:\> test.exe
2367460
这个数从哪来的?不知道。这是因为我们调用了一个需要参数的函数而没有传递参数给它,而这个函数还傻乎乎的以为传过了参数,从寄存器里读出它的参数就去干活了。那个寄存器里是什么值?谁也说不准。如果fun函数的参数是作为指针使用……,啊!麻烦大了!
要解决问题,对于上面的小程序,我们直接冲过去改掉就成了。但是如果你的程序里有1000个文件,平均每个文件5000行(真正大的项目要比这大的多),那你还能一行行检查下去吗?如果调试过程中出了问题而你还不知道是这个原因导致的,如果你的程序很少运行到这个地方,……
所以,正确的方法是防患于未然,写代码是养成良好的习惯。
对于使用gcc的朋友,建议总是使用“-Wall”,“-Wall”是一个细心的秘书,他会及时提醒你代码中存在的风险。
尽量避免使用extern修饰函数。一般情况下,如果我们希望某个函数可以被外界使用,就创建一个头文件,在其中声明该函数的类型。哪个程序需要调用这个函数就把它的头文件包含进去。这样一来如果调用的地方使用不当,在编译阶段就会提示错误,也节省了时间。而且,定义函数和声明函数是同一个人做的,出错的机会也就小了。