这种东西,不出错时完全不重要;一旦出错让人完全找不着北。
如果被调函数在单独的文件中定义,比如
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。
评论