第五天2017/04/06(下午1:C、C++混合编程 与 #ifdef __cplusplus extern "C"{ })
来源:互联网 发布:营业部买卖数据 编辑:程序博客网 时间:2024/04/30 15:43
C++、C编译器对函数编译的相关知识: C++支持函数重载,而C不支持,两者的编译规则也不一样。函数被C++编译后在符号 库中的名字与C语言的不同。 例如,假设某个函数的原型为: void foo( int x, int y ); 该函数被C编译器编译后 在符号库中的名字可能为_foo,而C++编译器则会产生像_foo_int_int之类的名字。
【知识点】
#ifdef__cplusplus 是什么意思?时常在cpp的代码之中看到这样的代码:#ifdef__cplusplusextern"C"{#endif//众多函数的声明,形如void show1(); void show2();等#ifdef__cplusplus}#endif【疑问1】为什么要引入#ifdef__cplusplus...extern"C"...语法? 因为在.h头文件声明的函数,不知道这些函数是在.c文件中实现还是在.cpp文件中进行实现。 如果不用上面的语法,最后在main.c文件中或者main.cpp文件中使用上面已经实现的函数的时候,会由于C和C++编译器的不同,导致找不到函数引起“编译失败”。 所以,才引入了上面的语法,该语法带来的好处是:在.h头文件声明的函数,无论是在.c文件中实现还是在.cpp文件中实现,最后在main.c文件中或者main.cpp文件中使用上面已经实现的函数的时候,都会编译成功————>这样就实现了C与C++的混合编程。【疑问2】void show1(); void show2();上面两个函数是.c代码?还是.cpp代码?由什么决定? 答:由show1()、show2()函数在.c或者.cpp实现决定。(show函数如果在.c中实现,show函数就是.c代码;show函数如果在.cpp中实现,show函数就是.cpp代码)【疑问3】 有疑问2知道了该函数是.c代码还是.cpp代码之后,我们一般怎么使用这个结论呢? 以下面程序为例: void show() { #ifdef __cplusplus //如果show是.cpp代码,就调用下面的... ... #else //如果show不是.cpp代码,就调用下面的... ... #endif //#ifdef __cplusplus }
====================================================================================================
综合示例
由于不知道在头文件中声明的函数是在.c文件中定义?还是在.cpp文件中定义?-->因此①在头文件中引入#ifdef __cplusplus extern "C"{ //所有函数的声明 }语法。②在.c文件 \ .cpp文件中可以实现在.h文件中声明的函数。③在main.c文件 \ main.cpp文件中可以调用在②中实现的函数,且程序的执行结果一样。
【下面程序的功能介绍】//在头文件中声明两个函数:show1()和show2();//show1()在.cpp文件中实现,show2()在.c文件中实现;//在main.c或者main.cpp文件中调用show1()和show2()函数,执行结果一样。---------------------------------------------------------------------//head.h#ifndef _HEAD_H_#define _HEAD_H_#ifdef __cplusplus#include <iostream>using namespace std;extern "C"{#endif void show1(); void show2();#ifdef __cplusplus};#endif#endif---------------------------------------------------------------------//define_show1.cpp#include "head.h"void show1(){#ifdef __cplusplus cout<<"show1:这是一个c++程序"<<endl;#else printf("show1:这是一个C程序\n");#endif}---------------------------------------------------------------------//define_show2.c#include "head.h"void show2(){#ifdef __cplusplus cout<<"show1:这是一个c++程序"<<endl;#else printf("show2:这是一个C程序\n");#endif}---------------------------------------------------------------------//main.c或者main.cpp(二者运行结果一样)#include "head.h"int main(){ show1(); show2(); getchar();}【输出结果如下图所示】
分析输出结果: 输出结果由 实现show1()函数和实现show2()函数是在.c还是在.cpp 所决定!
0 0
- 第五天2017/04/06(下午1:C、C++混合编程 与 #ifdef __cplusplus extern "C"{ })
- #ifdef __cplusplus extern "C" {
- #ifdef __cplusplus extern "C"
- #ifdef __cplusplus extern "C"
- #ifdef __cplusplus extern "C"
- #ifdef __cplusplus extern "C"
- #ifdef __cplusplus extern "C"
- #ifdef __cplusplus extern “C”
- 深入理解C/C++混合编程(关于#ifdef __cplusplus extern "C" {...}的用法)
- C /C++混合编程——关于“#ifdef __cplusplus” 和 " extern "C" "
- #ifdef __cplusplus extern “C” #endif
- 关于#ifdef __cplusplus extern C
- #ifdef __cplusplus extern "c" { #endif
- #ifdef __cplusplus extern "C" { #endif
- #ifdef __cplusplus extern "C" 笔记
- #ifdef __cplusplus extern "C" { #endif
- extern “C"和#ifdef __cplusplus
- //#ifdef __cplusplus extern "C" 含义
- canvas径向渐变
- Linux下解决/boot分区不足
- EasyUI之验证框validatebox
- linux如何配置文件系统分区
- Servlet机制原理2
- 第五天2017/04/06(下午1:C、C++混合编程 与 #ifdef __cplusplus extern "C"{ })
- LeetCode 1. Two Sum
- Tomcat报错
- Hibernate学习笔记3--映射关联关系
- IT404过关游戏WP
- The method getContextPath() from the type HttpServletRequest refers to the missing type
- Hexo NexT 主题下 blockquote 文本内容超出不自动换行解决方式
- 背包九讲
- 2017 蓝桥杯JavaB组省赛 日期问题