来自与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` 与 `extern "C"` 的作用 #### 一、引言 在跨语言编程的场景中,特别是在混合使用 C 和 C++ 编程时,经常会遇到 `#ifdef __cplusplus` 以及 `extern "C"` 这样的预处理器指令和...
本文将深入探讨`#ifdef __cplusplus`语句的用途和机理,以及在C++编程中extern "C"的必要性。 首先,让我们来了解`#ifdef __cplusplus`语句的含义。在C++编程中,`__cplusplus`是一个自定义宏,用于判断当前编译器...
#ifdef __cplusplus extern "C" { #endif // C风格的函数或变量声明 #ifdef __cplusplus } #endif ``` 这样做的目的是,当代码在C++环境中编译时,`extern "C"`会被正确解析,而在C环境中编译时,这些预处理器...
本文实例讲述了基于...#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 *
#### 关键知识点:`#ifdef __cplusplus`、`extern "C"`及函数命名差异 在软件开发过程中,经常需要将已有的C语言代码集成到C++项目中,或者反之亦然。由于C++语言的设计初衷之一是为了向前兼容C语言,因此在C++中...
#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_...
#ifdef __cplusplus extern "C" { #endif void cFunc(); // C语言的函数声明 #ifdef __cplusplus } #endif ``` 在C++源文件中,通过包含`header.h`,可以正确地使用C语言的`cFunc`函数。 #### 4. extern与预...
#ifdef __cplusplus extern "C" { #endif // C 语言函数声明 int foo(int a, int b); #ifdef __cplusplus } #endif ``` 这样的代码告诉 C++ 编译器,即使在 C++ 文件中,也要按照 C 语言的方式来处理 `...
`__cplusplus`用于识别当前的编译环境,而`extern "C"`则用于指示编译器以C语言的规则处理特定的代码段,确保C++可以正确地调用C库。在跨平台开发中,掌握这些知识能够帮助我们有效地利用C库,并确保代码在不同环境...
通过上述讨论可以看出,通过合理利用`__cplusplus`宏和`extern "C"`关键字,我们可以轻松实现C和C++代码之间的互操作性。这不仅有助于提高代码的复用率,还能够简化项目管理过程。在实际应用中,建议开发者根据具体...
而`#ifdef __cplusplusextern "C" {#endif` 和 `#ifdef __cplusplus}#endif` 则是为了确保在C++环境中使用`extern "C"`,而在纯C环境中则不会产生额外的语法错误。 总结来说,`extern "C"`是C++为兼容C语言而设计的...
#ifdef__cplusplus extern"C"{ #endif ``` 为了支持 C++ 编译器,这里使用了 `extern "C"` 来确保即使在 C++ 环境下编译,也能正确处理 C 风格的函数原型。这样可以避免 C++ 的名称修饰导致的问题。 #### 基础类型...
#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;);...
`#ifdef __cplusplus`和`#endif`则是检查当前是否在C++环境中,以决定是否启用`extern "C"`。 6. 结论: `extern "C"`是C++为了与C语言兼容而提供的特性,它允许C++代码调用C库的函数和使用C库的全局变量,而不会...
#ifdef __cplusplus extern "C" { #endif // __cplusplus #ifndef __DSOUND_INCLUDED__ #define __DSOUND_INCLUDED__ /* Type definitions shared with Direct3D */ #ifndef DX_SHARED_DEFINES typedef float D3...
#ifdef __cplusplus extern "C" { #endif // C函数声明 void c_function(int x); #ifdef __cplusplus } #endif ``` #### 6. `static`变量的理解 **问题**:关于`static`变量的几个陈述中哪些是正确的...
#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_...
- `#define _cplusplus`放在`api.c`而不是`api.h`,因为C编译器不识别`extern "C"`,而`api.h`可能被C语言程序包含。 通过以上步骤,你就可以成功地将C++代码封装成C接口,并让C语言的程序能够调用这些功能。这种...