利用C++编译器查找C程序中很隐蔽的错误的一个例子

/*file1.c*/
#include<stdio.h>
void f(int i)
{
  printf("%d",i);
}

 

/*file2*/

#include<stdio.h>
void f(char c);
int main()
{
  f('c');
  return 0;
}

函数 void f(int i) 的实现在file1.c文件,file2.c中要调用这个函数。首先在调用之前声明这个函数,可惜声明中,这个函数的参数类型写错了。

在C编译器中编译上述文件,可以通过编译并且运行。因为对于C编译器而言,在编译file2.c文件的时候,能找到f函数的原型(虽然与实现不一致,但当时看不到),根据当前文件的声明完成编译。在连接的时候,file2.o需要找函数f的实现,它在file1.o找到了。连接成功了。

 

对于C++编译而言,在链接阶段会出问题。C++编译器对函数都有一个内部的命名,而不仅仅是通过程序员定义的函数名操作函数,在file1.c中,C++编译器会给 void f(int i)类似与f_int的命名,在file2.c中,void f(char c) 则可能会被命名为f_char。在链接的时候,就会出现找不到f_char函数的实现的错误。

 

posted @ 2012-08-09 14:04  llkkyy  阅读(445)  评论(0编辑  收藏  举报