函数原型很重要

这种东西,不出错时完全不重要;一旦出错让人完全找不着北。

如果被调函数在单独的文件中定义,比如

function.c:

void myfun(int i)
{
//do something with i
}

然后主函数文件中声明

main.c:

extern void myfun(int i);
int main()
{
myfun(-1); 
return 0;
}

这个程序完全没问题。

后续开发过程中,对myfun做了点改动,

void myfunL(long long i)
{
}

然后更新main函数中的调用为myfunL(-1),但忘记更新main.c中的函数声明了,于是悲剧了,编译器会认为main.c中的myfunL()默认接受int参数,这时传递过来的-1只放到了实参的一半内存中,另一半内存是随机的!亦即,程序执行时myfunL接受的实参可能为i=0xad324183ffffffff, 而不是真正的-1=0xffffffffffffffff。

这种情况下,本来编译器会警告:myfunL() declared implicitly. 但自己悲剧的加了-Wbrief选项,结果那个版本的编译器就不输出这个警告。于是,花了半天时间查出这个bug。

评论

呵呵,吃一堑长一智 提交者: 冷雷 (未验证)

评论查看选项

选择您喜欢的显示评论的模式,并点击"保存设置"来激活您所做的改变。