zoukankan      html  css  js  c++  java
  • 利用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函数的实现的错误。

  • 相关阅读:
    vue(5)
    vue(4)
    vue(3)-防止闪烁
    vue(2)
    bootstrap 模态框
    2017年上半年工作总结和计划
    vue(1)
    文本框数量加减功能
    meta 控制移动端页面的缩放
    题解 P1550 【[USACO08OCT]打井Watering Hole】
  • 原文地址:https://www.cnblogs.com/liujiangyi/p/2630189.html
Copyright © 2011-2022 走看看