利用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函数的实现的错误。