1、在好多程序中我们会遇到下面代码段

#ifdef __cplusplus
        extern "C" {
        #endif

//c语法代码段

#ifdef __cplusplus
        }
        #endif //

首先应该知道,__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"来说明。

作者:宋老师,华清远见嵌入式学院讲师

#ifdef __cplusplus extern "C" { #endif的更多相关文章

  1. #ifdef __cplusplus extern c #endif 的作用

    #ifdef __cplusplus // C++编译环境中才会定义__cplusplus (plus就是"+"的意思) extern "C" { // 告诉编 ...

  2. “#ifdef __cplusplus extern "C" { #endif”的定义

    平时我们在linux c平台开发的时候,引用了一些Cpp或者C的代码库,发现一些头文件有如下代码条件编译. #ifdef __cplusplus extern "C" { #end ...

  3. “#ifdef __cplusplus extern "C" { #endif”的定义-----C和C++的互相调用

    "#ifdef __cplusplus extern "C" { #endif"的定义 看一些程序的时候老是有 "#ifdef __cplusplus ...

  4. #ifdef __cplusplus extern "C" { #endif”的定义

      平时我们在linux c平台开发的时候,引用了一些Cpp或者C的代码库,发现一些头文件有如下代码条件编译. #ifdef __cplusplus extern "C" { #e ...

  5. #ifdef __cplusplus extern "C" { #endif”的定义的含义

    看一些程序的时候老是有“#ifdef __cplusplusextern "C" {#endif”的定义,搞搞清楚是怎么回事: Microsoft-Specific Predefi ...

  6. C++ 为什么要使用#ifdef __cplusplus extern "C" { #endif

    转载:http://www.cnblogs.com/ayanmw/archive/2012/03/15/2398593.html 转载:http://blog.csdn.net/zkl99999/ar ...

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

    好多程序中都会遇到下列代码段: #ifdef __cplusplus extern "C" { #endif /****************** C语法代码段 ******** ...

  8. 备忘录:“#ifdef __cplusplus extern "C" { #endif”的定义

    看一些程序的时候老是有“#ifdef __cplusplusextern "C" {#endif”的定义,搞搞清楚是怎么回事: Microsoft-Specific Predefi ...

  9. undefined reference to `recvIpcMsg(int, ipc_msg*)'——#ifdef __cplusplus extern "C" { #endif

    最近在弄一个进程间通信,原始测试demon用c语言写的,经过测试ok,然后把接口封装起来了一个send,一个recv. 使用的时候send端是在一个c语言写的http服务端使用,编译ok没有报错,但是 ...

随机推荐

  1. html 鼠标移入标签 显示小手指

    <div style="width: 200px; height: 200px; background: red; cursor: pointer;"></div ...

  2. js 去除空格

    var MAX_PERIOD = $('#MAX_PERIOD').val(); // 借款的最大期限 MAX_PERIOD=Trim(MAX_PERIOD,"g");   //带 ...

  3. oracle的表空间

    创建表空间 1:创建单个文件的表空间 CREATE TABLESPACE SAMPLE LOGGING DATAFILE 'D:\11.dbf' SIZE 5M REUSE EXTENT MANAGE ...

  4. zw版【转发·台湾nvp系列Delphi例程】HALCON SetLineStyle1

    zw版[转发·台湾nvp系列Delphi例程]HALCON SetLineStyle1 procedure TForm1.Button1Click(Sender: TObject);var img : ...

  5. [tp3.2.1]数据模型 - 简单的模型连接

    新建数据库数据库连接功能    1.写conf.php        /* 数据库设置 */        'DB_TYPE'               =>  '',     // 数据库类 ...

  6. 【fedora】设置fedora系统

    1.安装自动选择最快源的插件fastestmirror: #sudo yum -y install axel yum-plugin-fastestmirror && sudo yum ...

  7. 【linux】xrander/cvt自定义分辨率

    今天在虚拟机上装了一个LUbuntux64(12.10)玩,安装的时候,由于主板默认是没有开虚拟化支持,报错,改后相当的顺利.但是进入系统后,屏幕显示分辨率为800X600的,全屏的话,在大显示器上显 ...

  8. Atom 和 Sublime Text 相比哪个好?

    好像截止到今天还分不出来,Sublime确实会快一点.

  9. 操作系统,windows编程,网络,socket

    首发:个人博客,更新&纠错&回复 之前关于c/s的一篇博文只记了思路没记代码,而且表达不清晰,事后看不知所云,这个习惯要改. 这十几天学了点关于操作系统.windows编程和网络,主要 ...

  10. 161010、在大型项目中组织CSS

    编写CSS容易. 编写可维护的CSS难. 这句话你之前可能听过100次了. 原因是CSS中的一切都默认为全局的.如果你是一个C程序员你就知道全局变量不好.如果你是任何一种程序员,你都知道隔离和可组合的 ...