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. Lintcode: Matrix Zigzag Traversal

    Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in ZigZag-or ...

  2. 转:Jmeter之Bean shell使用(二)

    上一篇Jmeter之Bean shell使用(一)简单介绍了下Jmeter中的Bean shell,本文是对上文的一个补充,主要总结下常用的几种场景和方法,相信这些基本可以涵盖大部分的需求.本节内容如 ...

  3. UML: 部署图

    说部署图之前,先看看某24小时便利店管理系统的网络拓扑结构图: 这个图描述了本系统的整体物理结构,从该图我们可以得到以下信息:1.该便利店集团有总部和多个门店,总部管理财务.仓库.采购等事宜.2.二级 ...

  4. javascript 异常处理和事件处理

    异常捕获 1.异常:当javascript引擎执行JS代码时,发生了错误,导致程序停止运行. 2.异常抛出:当异常产生,并且将这个异常生成一个错误信息 3.异常捕获: try{发生异常的代码块:}ca ...

  5. mysql bin log日志

    装mysql,运行一段时间后,在mysql目录下出现一堆类似mysql-bin.000***,从mysql-bin.000001开始一直排列下来,而且占用了大量硬盘空间,高达几十个G. 对于这些超大空 ...

  6. 动态LOV语句、向具有LOV的ITEM赋值时报FRM-40212需要验证错误

    网上解决方法: http://www.itpub.net/thread-845812-2-1.html http://blog.csdn.net/rfb0204421/article/details/ ...

  7. 安装Debian的正确方法

    一.说明: Debian7.0.0的安装镜像文件有3个DVD,安装基本系统只用到第一个镜像文件,即DVD1 其它镜像文件是附带的软件包. 附Debian 7.0.0系统镜像下载地址: 32位:http ...

  8. 【海岛帝国系列赛】No.6 海岛帝国:战争前线

    50234237海岛帝国:战争前线 [试题描述] 总指挥官WHT出神入化的计谋虽然大有用武之地,但是聪明的恐怖分子们采取了城市核武器防御系统,可以有效地抵制WHT的炸弹.YSF对此头痛不已,因此 召开 ...

  9. Java应用程序的打包和发布

    Java应用程序的打包和发布 简化Java应用程序的打包和发布 发布Java应用程序时Java提供了一系列打包和发布工具,可以显著的简化发布过程 该文章提供了打包Java code的几种方法,探讨Ja ...

  10. Jsoup的demao

    package com.ch.jsoupdemo; import java.io.IOException; import org.jsoup.Jsoup;import org.jsoup.nodes. ...