#ifdef _cplusplus (转)

原文不可考,转载链接:http://blog.csdn.net/owldestiny/article/details/5772916

有发现原文的请告知,我会及时更新。

时常在cpp的代码之中看到这样的代码:

#ifdef __cplusplus

extern "C" {

#endif

//一段代码

#ifdef __cplusplus

}

#endif

这样的代码到底是什么意思呢?首先,__cplusplus是cpp中的自定义宏,那么定义了这个宏的话表示这是一段cpp的代码,也就是说,上面的代码的含义是:如果这是一段cpp的代码,那么加入extern "C"{和}处理其中的代码。

  要明白为何使用extern "C",还得从cpp中对函数的重载处理开始说起。在c++中,为了支持重载机制,在编译生成的汇编码中,要对函数的名字进行一些处理,加入比如函数的返回类型等等.而在C中,只是简单的函数名字而已,不会加入其他的信息.也就是说:C++和C对产生的函数名字的处理是不一样的. 目的就是主要实现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()

{

}

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

在cpp.cpp中调用c.c中的C_test()

cpp.cpp的实现

#include "c.h"

int main()

{

C_fun()

}

其中__cplusplus是C++编译器的保留宏定义.就是说C++编译器认为这个宏已经定义了.

所以关键是extern "C" {}

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

==========================

那么C中是如何调用C++中的函数cpp_fun()呢?

因为先有C后有C++, 所以只能从C++的代码中考虑了.

加入C++中的函数或变量有可能被C中的文件掉用,则应该这样写,也是用extern "C"{}

不过是代码中要加,头文件也要加,因为可能是C++中也调用

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

cpp.h的实现

#ifndef _c_h_

#define _c_h_

#ifdef __cplusplus

extern "C" {

#endif

void CPP_fun();

#ifdef __cplusplus

}

#endif

#endif

.-------------------------------------------

Cpp.cpp的实现

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

void CPP_fun()

{

.....

}

总结

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

时间: 2024-08-07 04:19:59

#ifdef _cplusplus (转)的相关文章

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

转载:http://www.cnblogs.com/ayanmw/archive/2012/03/15/2398593.html 转载:http://blog.csdn.net/zkl99999/article/details/48134621 转载: http://www.jianshu.com/p/5d2eeeb93590 经常看到别人的头文件 有这样的代码 #ifdef __cplusplus extern "C" { #endif // C 样式 的函数 #ifdef __cp

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

看一些程序的时候老是有 "#ifdef __cplusplus extern "C" { #endif"的定义,搞搞清楚是怎么回事: Microsoft-Specific Predefined Macros __cplusplus Defined for C++ programs only. 意思是说,如果是C++程序,就使用 extern "C"{ 而这个东东,是指在下面的函数不使用的C++的名字修饰,而是用C的 The following c

#ifdef __cplusplus extern "C" { #endif 的意思(转)

Microsoft-Specific Predefined Macros__cplusplus Defined for C++ programs only. 意思是说,如果是C++程序,就使用extern "C"{而这个东东,是指在下面的函数不使用的C++的名字修饰,而是用C的 The following code shows a header file which can be used by C and C++ client applications:// MyCFuncs.h#i

Android--JNI编程详解

Android系统不允许一个纯粹使用C/C++的程序出现,它要求必须是通过Java代码嵌入Native C/C++--即通过JNI的方式来使用本地(Native)代码.因此JNI对Android底层开发人员非常重要. 如何将.so文件打包到.APK 让我们 先 从最简单的情况开始,假如已有一个JNI实现--libxxx.so文件,那么如何在APK中使用它呢? 实现步骤如下: 1.在你的项目根目录下建立libs/armeabi目录: 2.将libxxx.so文件copy到 libs/armeabi

4.8一些杂散但是值得讨论的问题

4.8.1操作系统究竟是什么玩意? 4.8.1.1像人类社会一样的计算机软件系统(有些人只埋头苦干,有些人只做管理) (1)人类社会最开始时人人都干活,这时候没有专业分工,所有人都直接做产生价值的工作.当时时合适的,因为当时生产力低下,人口稀少.就像裸机程序一样(逻辑程序的特点:代码量小,功能简单.所有代码都和直接目的有关,没有服务性代码) (2)后来人口增加生产力提高,有一部分人脱离了直接产生价值的体力劳动专职指挥(诞生了阶级).本质上来说是合理的,因为资源得到了优化配置,提升了整体的效率.当

指针、数组的理解与关系

一.指针的本质:变量,指针变量就是指针变量int *p:两个变量,一个p(指针变量本身)是int *类型的 另一个是*p(指针指向的那个变量)是int类型的注:指针说白了就是指针类型,前面定义的int类型是为了说明指针指向的那个数的类型,所以指针的解析方式都是按地址来解析的(不管你是char *还是double *,解析方式都是地址)而指向的那个数的类型就要看你怎么定义的了例如:int *aa是按照地址来解析的:*a则是按照int类型来解析的. (1)所有的类型的数据存储在内存中,都是按照二进制

_cpluscplus

_cpluscplus是c++中的定义,而c中没有该定义 1.用来判定代码是c类型还是c++类型 2._cplusplus的类型是"long int",值为199711L 1 int main() 2 { 3 #ifdef _cplusplus 4 printf("This is c++ program"); 5 #else 6 printf("This is c program"); 7 }

source insight自定义宏脚本

1 /* 获取当前的文件名*/ 2 macro wcjFileName() 3 { 4 hbuf = GetCurrentBuf() 5 6 fullname = GetBufName(hbuf) 7 length = strlen(fullname) 8 if (length == 0) 9 return "" 10 11 index = length 12 while ("\\" != fullname[--index]); 13 14 purename = &

C C++相互调用实例

一  C调用C++ 1. 代码组织 2. test.h /************************************************************************* > File Name: test.h > Author: ma6174 > Mail: [email protected] > Created Time: Tue 11 Nov 2014 04:18:38 PM WST *****************************