学习 zigbee 遇到的问题
2011-03-30 23:56
176 查看
关于#indef __cplusplus extern
这个问题困惑很久,一个吉大的学长告诉我他面试时问到了这个问题,他也不明白
今有幸看到一些文章算是略懂,整合一下几个兄台的文章如下
时常在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
这样的代码到底是什么意思呢?首先,__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()
{
.....
}
这个问题困惑很久,一个吉大的学长告诉我他面试时问到了这个问题,他也不明白
今有幸看到一些文章算是略懂,整合一下几个兄台的文章如下
时常在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
这样的代码到底是什么意思呢?首先,__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()
{
.....
}
相关文章推荐
- hadoop学习遇到的问题(2016.12.26-2017.01.02)
- 使用IAR和ZigBee遇到的问题
- 从ACCESS转到学习SQLSERVER所遇到的几个问题
- selenium学习中遇到的问题
- android学习遇到的问题汇总1
- 学习react遇到的问题
- 学习makefile(记录遇到的问题)
- 学习安卓开发 学习知识点遇到的问题
- xlua学习过程遇到的问题,以后通了之后可能就不是问题了。但是还是有记录的必要。
- Nutz学习之初始化数据库遇到的问题
- Linux 学习一 搭建环境系列之三 linux搭建django 以及搭建django时遇到的各种问题
- 关于学习java中遇到瓶颈的问题
- 小白tensorflow学习中遇到的问题
- 基于ZigBee的物联网家居系统学习-android端app的问题The type java.lang.Class cannot be resolved. It is indirectly refer
- 学习QT线程时所遇到的问题。
- 学习韩顺平校内网项目时遇到的问题及解决方法之用eclipse整合hibernate
- 学习Maven 遇到的问题
- Fragment的使用与学习过程中遇到的问题
- 在学习C语言时遇到的一些细节方面的问题
- android 学习中遇到的问题及解决方法