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

 

原文链接: https://www.cnblogs.com/liujiangyi/archive/2012/08/09/2630189.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

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

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/58638

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 上午8:47
下一篇 2023年2月9日 上午8:48

相关推荐