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

  • 相关阅读:
    python signal模块
    linux 下修改时间
    CentOS7关闭防火墙和SELinux
    centOS安装配置NFS
    python 调 java(胶水就是胶水)
    uuid
    python 最麻烦的时间有药了
    linux crontab
    Linux awk+uniq+sort 统计文件中某字符串出现次数并排序
    trove taskmanger api
  • 原文地址:https://www.cnblogs.com/liujiangyi/p/2630189.html
Copyright © 2011-2022 走看看