C语言使用extern函数要注意

文章出处:http://www.52rd.com/blog/Detail_RD.Blog_apollo_2616.html

 

    用extern修饰函数是表示被修饰的函数定义在当前文件外,而该函数用extern声明类型后就可以被当前文件调用了。使用extern修饰某函数时,对该函数的调用是在连接阶段才被处理的。下面我们看一段代码。

/***********************************************
 * fun.c
 ***********************************************/

#include <stdio.h>

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修饰函数。一般情况下,如果我们希望某个函数可以被外界使用,就创建一个头文件,在其中声明该函数的类型。哪个程序需要调用这个函数就把它的头文件包含进去。这样一来如果调用的地方使用不当,在编译阶段就会提示错误,也节省了时间。而且,定义函数和声明函数是同一个人做的,出错的机会也就小了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值