#ifdef __cplusplus extern"C" { #endif 的解释


在很多程序里面,我们都会见到如下代码段:

#ifdef    __cplusplus
extern "C" {
#endif

/*
 * C代码段
 */

#ifdef __cplusplus
}
#endif

__cplusplus是CPP中自定义的宏,表示这是一段cpp代码,编译器按照C++的方式编译系统。如果这时候我们需要使用C语言的代码,那么就需要加上extern "C" {说明一下该部分为C代码段,编译器用C语言的模式编译。否则编译器会把C代码按C++模式编译,会出现问题。因为C++和C语言对于函数的编译转换不一样,主要是因为C++中存在重载。在C++中,为了支持重载机制,在编译生成的汇编代码中,要对函数的名字进行一些处理,加入比如函数的返回类型等等。而在C中,只是简单的函数名字而已,不会加入其他信息。也就是说:C++和C对产生的函数名字的处理是不一样的。加上extern "C"{的目的就是要实现C和C++相互调用的问题。

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

C和C++函数相互调用实例

C++中调用C函数

c.h的实现

#ifndef _c_h_
#define _c_h_

#ifdef __cplusplus
extern "C" {
#endif


void C_func();

#ifdef __cpluspuls
}
#endif

#endif

c.c的实现

#include "c.h"

void C_func()
{
}

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

cxx.cpp的实现:

#include "c.h"

int main()
{
    C_func();

    return 0;
}

所以:C++调用C的函数时,在C++的头文件中(.h文件)中加入extern "C" {}。

C中调用C++函数

cxx.h的实现:

#ifndef _cxx_h_
#define _cxx_h_

#ifdef __cplusplus
extern "C" {
#endif

void CPP_func();

#ifdef __cplusplus
}
#endif

#endif

cxx.cpp的实现:

extern "C" {  //告诉C++编译器,括号里按照C的命名规则编译

  void CPP_func()
  {
  }

}

c.c的实现:

#include "cxx.h"

int main()
{
  CPP_func();

  return 0;
}

所以:C调用C++中的函数的话,头文件和代码文件中都要加extern "C" {},因为可能是C++中也调用。


添加新评论

选择表情 captcha

友情提醒:不填或错填验证码会引起页面刷新,导致已填的评论内容丢失。

|