zoukankan      html  css  js  c++  java
  • 在C++中如何使用C

    如下代码:

    /*C语言头文件:Max.h*/

    #ifndef _MAX_H_

    #define _MAX_H_

    int Max(int nA,int nB)

    #endif

    /*C语言实现文件:Max.c*/

    #include "Max.h"

    int Max(int nA,int nB)

    {

      return((nA-nB)?(nA):(nB));

    }

    /*C++语言调用文件*/

    #include "Max.h"

    int _tmain(int argc,char* argv[])

    {

      int nMax = Max(1,2);

      return 0;

    }

    上述代码在Visual C++中编译会出错(error LNK2019:无法解析的外部符号"int __cdecl Max(int,int)"(?Max@@YAHHH@Z),该符号在函数_wmain中被引用

    如果把上述的Max.h代码修改如下:

    /*C语言头文件*/

    #ifndef __MAX_H__

    #define __MAX_H__

    #ifdef __cplusplus

    extern "C"{

    #endif

      int Max(int nA,int nB);

    #ifdef __cplusplus

    };

    #endif

    #endif

    编译通过

    结论:在C++中调用C的代码必须把原来的C语言声明放到extern "C"{/*code*/}中,否则在C++中无法编译通过

    原因:C和C++具有完全不同的编译和链接方式。C语言编译器编译函数时不带函数的类型和作用域信息,只包含函数符号名字;而c++编译器为了实现函数的重载,在编译时会带上函数的类型和作用域信息。

    例如:假如某一函数原型为:int Func(int nA,int nB)

    C语言编译器把函数编译成类似_Func的符号,C链接器只要找到这个符号就可以连接成功,实现调用。而在C++语言中,编译器会检查参数类型和作用域信息,上述函数原型会编译成_Z_Func_int_int这样的符号。在链接过程中,C++链接器会在函数原型所在模块生成的目标文件中查找__Z_Func_int_int.

    总结:C++中调用C代码的3种具体实现方式

    1.修改C代码的头文件,当其被用于C++代码时,在声明中加入exter "C"    上例中在Max.h中加入extern "C" int Max(int nA,int nB);

    2.在C++代码中(Main.cpp)重新声明一下C函数,在重新声明时添加extern "C".

    #include "Max.h"

    extern "C" int Max(int nA,int nB);

    3.在包含C头文件(Main.cpp)时,添加extern "C".

    extern "C"{

    #include "Max.h"

    }

    注意:extern "C" 一定要加在C++的代码文件中才起作用

  • 相关阅读:
    (转)通过Javascript得到URL中的参数(query string)
    (转)对存储过程进行加密和解密(SQL 2008/SQL 2012)
    (转)怎样玩转千万级别的数据
    (转)mongodb学习(翻译1)
    (转)Web API 强势入门指南
    (转)正则表达式—RegEx(RegularExpressio)(三)
    学习进度-16 python爬虫
    学习进度-15 变量类型的转换
    学习进度-14
    学习进度-13
  • 原文地址:https://www.cnblogs.com/fenghuan/p/4848540.html
Copyright © 2011-2022 走看看