`
freesoftman
  • 浏览: 319782 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

关于#ifdef __cplusplus extern

阅读更多

来自与http://blog.csdn.net/nih1986517/archive/2008/10/12/3065386.aspx

 

 

时常在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"来说明。

分享到:
评论

相关推荐

    解译#ifdef __cplusplus

    ### 解析 `#ifdef __cplusplus` 与 `extern "C"` 的作用 #### 一、引言 在跨语言编程的场景中,特别是在混合使用 C 和 C++ 编程时,经常会遇到 `#ifdef __cplusplus` 以及 `extern "C"` 这样的预处理器指令和...

    #ifdef __cplusplus深度剖析

    本文将深入探讨`#ifdef __cplusplus`语句的用途和机理,以及在C++编程中extern "C"的必要性。 首先,让我们来了解`#ifdef __cplusplus`语句的含义。在C++编程中,`__cplusplus`是一个自定义宏,用于判断当前编译器...

    extern C详细解释

    #ifdef __cplusplus extern "C" { #endif // C风格的函数或变量声明 #ifdef __cplusplus } #endif ``` 这样做的目的是,当代码在C++环境中编译时,`extern "C"`会被正确解析,而在C环境中编译时,这些预处理器...

    基于C语言实现的aes256加密算法示例

    本文实例讲述了基于...#ifdef __cplusplus extern C { #endif typedef struct { uint8_t key[32]; uint8_t enckey[32]; uint8_t deckey[32]; } aes256_context; void aes256_init(aes256_context *, uint8_t *

    C语言代码用在c++环境中

    #### 关键知识点:`#ifdef __cplusplus`、`extern "C"`及函数命名差异 在软件开发过程中,经常需要将已有的C语言代码集成到C++项目中,或者反之亦然。由于C++语言的设计初衷之一是为了向前兼容C语言,因此在C++中...

    错误Amr文件修复

    #ifdef __cplusplus extern "C" { #endif /* * Class: cn_com_util_Jni * Method: convert_mp3_mehtod * Signature: (Ljava/lang/String;)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_...

    extern用法详解extern用法详解extern用法详解extern用法详解

    #ifdef __cplusplus extern "C" { #endif void cFunc(); // C语言的函数声明 #ifdef __cplusplus } #endif ``` 在C++源文件中,通过包含`header.h`,可以正确地使用C语言的`cFunc`函数。 #### 4. extern与预...

    extern C详细解释,word版

    #ifdef __cplusplus extern "C" { #endif // C 语言函数声明 int foo(int a, int b); #ifdef __cplusplus } #endif ``` 这样的代码告诉 C++ 编译器,即使在 C++ 文件中,也要按照 C 语言的方式来处理 `...

    关于C++中编译C代码的条件编译说明

    `__cplusplus`用于识别当前的编译环境,而`extern "C"`则用于指示编译器以C语言的规则处理特定的代码段,确保C++可以正确地调用C库。在跨平台开发中,掌握这些知识能够帮助我们有效地利用C库,并确保代码在不同环境...

    c与c++头文件兼容宏定义

    通过上述讨论可以看出,通过合理利用`__cplusplus`宏和`extern "C"`关键字,我们可以轻松实现C和C++代码之间的互操作性。这不仅有助于提高代码的复用率,还能够简化项目管理过程。在实际应用中,建议开发者根据具体...

    extern “C”使用详解.doc

    而`#ifdef __cplusplusextern "C" {#endif` 和 `#ifdef __cplusplus}#endif` 则是为了确保在C++环境中使用`extern "C"`,而在纯C环境中则不会产生额外的语法错误。 总结来说,`extern "C"`是C++为兼容C语言而设计的...

    windef.h源文件

    #ifdef__cplusplus extern"C"{ #endif ``` 为了支持 C++ 编译器,这里使用了 `extern "C"` 来确保即使在 C++ 环境下编译,也能正确处理 C 风格的函数原型。这样可以避免 C++ 的名称修饰导致的问题。 #### 基础类型...

    C++Builder调用vs2010演示代码

    #ifdef __cplusplus extern "C" { #endif DECLDIR int __stdcall InitKpHttp(void); DECLDIR int UnInitKpHttp(void); DECLDIR int KpHttpRequest(char *strurl,char *strhost,char *strresult,int &resultle;);...

    extern c 用法解析

    `#ifdef __cplusplus`和`#endif`则是检查当前是否在C++环境中,以决定是否启用`extern "C"`。 6. 结论: `extern "C"`是C++为了与C语言兼容而提供的特性,它允许C++代码调用C库的函数和使用C库的全局变量,而不会...

    视频监控系统源代码vc

    #ifdef __cplusplus extern "C" { #endif // __cplusplus #ifndef __DSOUND_INCLUDED__ #define __DSOUND_INCLUDED__ /* Type definitions shared with Direct3D */ #ifndef DX_SHARED_DEFINES typedef float D3...

    extern声明辨析

    #ifdef __cplusplus extern "C" { #endif // C函数声明 void c_function(int x); #ifdef __cplusplus } #endif ``` #### 6. `static`变量的理解 **问题**:关于`static`变量的几个陈述中哪些是正确的...

    详细介绍如何在展讯平台上添加菜单(最后附有源代码)[汇编].pdf

    #ifdef __cplusplus extern "C" { #endif #define MACRO_MDU_TYPE MACRO_MDU_TEXT #include "macro_mdu_def.h" typedef enum MY_APP_TEXT_ID_E { MY_APP_TXT_HELLO_WORLD, // 更多文本ID } MY_APP_TEXT_ID_...

    c++封装成c接口.docx

    - `#define _cplusplus`放在`api.c`而不是`api.h`,因为C编译器不识别`extern "C"`,而`api.h`可能被C语言程序包含。 通过以上步骤,你就可以成功地将C++代码封装成C接口,并让C语言的程序能够调用这些功能。这种...

Global site tag (gtag.js) - Google Analytics