#ifdef __cplusplus extern C的功能

#ifdef __cplusplus extern C的功能

#ifdef __cplusplus 
extern "C" { 
#endif

//c语法的一段代码

#ifdef __cplusplus 

#endif

  如果你不想理解这段代码的意义,那么请你记住:在你的代码不知道是被c调用还是c++调用时,请添加此段代码。
  下面详细说明此段代码的意义:
 __cplusplus是c++定义的宏,如果是c++调用的话,extern c声明会有效。如果时c调用的话,那么,extern c声明无效。
      要明白为何使用extern "C",还得从cpp中对函数的重载处理开始说起。在c++中,为了支持重载机制,在编译生成的汇编码中,要对函数的名字进行一些处理,加入比如函数的返回类型等等.而在C中,只是简单的函数名字而已,不会加入其他的信息.也就是说:C++和C对产生的函数名字的处理是不一样的. 目的就是主要实现C与C++的相互调用问题。

  首先应该知道,__cplusplus是CPP中的自定义宏,则表示这是一段cpp的代码,编译器按c++的方式编译系统.。如果这时候我们需要使用c语言的代码,那么就需要加上(extern "C" { )这一段来说明,要不编译器会把c代码按c++模式编译,会出现问题。

  这句话的意思是:这个代码是CPP的代码,__cplusplus是cpp中的自定义宏,因此,以CPP语言的形式编译,但是里面的代码有C语言的代码,那么就要“extern "C" { ”说明一下,编译器用C语言的模式编译。

  #ifdef __cplusplus //c++编译环境中才会定义__cplusplus (plus就是"+"的意思)
  extern"C"{ /告诉编译器下面的函数是c语言函数(因为c++和c语言对函数的编译转换不一样,主要是c++中存在重载)
  #endif

  要明白为何使用extern "C"{,还得从CPP中对函数的重载处理开始说起。在c++中,为了支持重载机制,在编译生成的汇编码中,要对函数的名字进行一些处理,加入比如函数的返回类型等等。而在C中,只是简单的函数名字而已,不会加入其他的信息。也就是说:C++和C对产生的函数名字的处理是不一样的。 加上extern "C"{ 目的,就是主要实现C与C++的相互调用问题。

  extern "C"是连接申明(linkage declaration),被extern "C"修饰的变量和函数是按照C语言方式编译和连接的。

1、C++ 调用C中函数的实例:

  c.h的实现

  #ifndef _c_h_
  #define _c_h_

  #ifdef __cplusplus
  extern "C" {
    #endif

    void C_fun();

    #ifdef __cplusplus
  }
  #endif

  #endif
        -----------------------------------

  c.c的实现

  #include "c.h"
  void C_fun()
  {
  }

------------------------------------

  在cxx.cpp中调用c.c中的C_fun()

  cxx.cpp的实现

  #include "c.h"
  int main()
  {
    C_fun()
  }

  C++调用C的函数时,在c++的 .h 文件中加extern "C" {}。

  所以关键是extern "C" {} ,extern "C"是告诉C++编译器件括号里的东东是按照C的obj文件格式编译的,要连接的话按照C的命名规则去找。

2、C调用C++中的函数CPP_fun()

  因为先有C后有C++,所以只能从C++的代码中考虑了。加入C++中的函数或变量有可能被C中的文件掉用,则应该这样写,也是用extern "C"{},不过是代码中要加,头文件也要加,因为可能是C++中也调用

  Cxx.h的实现

  #ifndef _c_h_
  #define _c_h_

  #ifdef __cplusplus
  extern "C" {
    #endif

    void CPP_fun();

    #ifdef __cplusplus
  }
  #endif

  #endif

  Cxx.cpp的实现

  extern "C" { //告诉C+++编译器,扩号里按照C的命名规则编译
      void CPP_fun()
    {
      .....
    }
   }

  c.c的实现

  #include "Cpp.h"
  int main()
  {
    CPP_fun()
  }

  总结:C和C++对函数的处理方式是不同的.extern "C"是使C++能够调用C写作的库文件的一个手段,如果要对编译器提示使用C的方式来处理函数的话,那么就要使用extern "C"来说明。

发布了61 篇原创文章 · 获赞 0 · 访问量 1090

猜你喜欢

转载自blog.csdn.net/qq_20312079/article/details/104814893
今日推荐