C++、C编译器对函数编译的相关知识:C++支持函数重载,而C不支持,两者的编译规则也不一样。函数被C++编译后在符号库中的名字与C语言的不同。例如,假设某个函数的原型为: void foo( int x, int y ); 该函数被C编译器编译后在符号库中的名字可能为_foo,而C++编译器则会产生像_foo_int_int之类的名字。

【知识点】

#ifdef__cplusplus 是什么意思?时常在cpp的代码之中看到这样的代码:
#ifdef__cplusplus
extern"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"
{
#endifvoid show1();void show2();
#ifdef __cplusplus
};
#endif#endif
---------------------------------------------------------------------
//define_show1.cpp
#include "head.h"void show1()
{
#ifdef __cpluspluscout<<"show1:这是一个c++程序"<<endl;
#elseprintf("show1:这是一个C程序\n");
#endif
}
---------------------------------------------------------------------
//define_show2.c
#include "head.h"void show2()
{
#ifdef __cpluspluscout<<"show1:这是一个c++程序"<<endl;
#elseprintf("show2:这是一个C程序\n");
#endif
}
---------------------------------------------------------------------
//main.c或者main.cpp(二者运行结果一样)
#include "head.h"int main()
{show1();show2();getchar();
}【输出结果如下图所示】

分析输出结果:输出结果由 实现show1()函数和实现show2()函数是在.c还是在.cpp 所决定!

第五天2017/04/06(下午1:C、C++混合编程 与 #ifdef __cplusplus extern C{ })相关推荐

  1. 第五天2017/04/06(下午2:动态链接库(DLL))

    创建动态库:新建一个DLL的VS工程,选择"空项目",此时会进入到新建的项目工程中:在项目工程中添加.h..c..cpp文件,并且填写代码:编译运行,在Debug下生成.dll和. ...

  2. 第五天2017/04/06(下午3:静态链接库(Lib))

    原文链接:http://blog.csdn.net/xiaoding133/article/details/8973436 一.静态链接库和动态链接库 1.静态链接库(.LIB):函数和数据被编译进一 ...

  3. 第五天2017/04/06(上午:文件的“读写操作”)

    文件的"读"."写"的理解不是站在"程序"的角度,而是站在"文件"的角度读:从文件中读取数据,输出到程序中写:从程序中读 ...

  4. 笑面的学校日常(14)最近一次更新2017 04 06

    未完待续-- 14:卡贴 我的卡贴做好了!! 我做了200张,只有两三张有点模糊,海狗日天他们俩每人做了个二三十张,结果只有两三张清楚,哈哈哈哈-- 班里有好多男生说杀生丸是女的!!!这怎么能忍?还有 ...

  5. 工作日志-2017年06月04日

    工作日志-2017年06月04日 各位朋友:大家晚上好,今天又度过了一天,QC班长今天又要发布自己的工作总结了,写博客是自己记录生活成长最好的方式,既可以分享给有缘的朋友,又能帮助别人,这一点是我最开 ...

  6. 2017年06月07号课堂笔记

    2017年06月07号 晴 空气质量:中度污染->良 内容:jQuery第二节:基本选择器,层次选择器,属性选择器, 基本过滤选择器,可见性过滤选择器 备注:代课老师:李老师 一.基本选择器 1 ...

  7. 软考解析:2017年上半年下午试卷

    软考解析:2017年上半年下午试卷 第一题:数据流图 第二题:数据库设计 第三题:面向对象开发 真题 理论 类图 状态图 解题思路 第四题:算法与数据结构 第五题:设计模式与Java 转载于:http ...

  8. 【跃迁之路】【425天】程序员高效学习方法论探索系列(实验阶段182-2018.04.06)...

    @(跃迁之路)专栏 实验说明 从2017.10.6起,开启这个系列,目标只有一个:探索新的学习方法,实现跃迁式成长 实验期2年(2017.10.06 - 2019.10.06) 我将以自己为实验对象. ...

  9. 软考解析:2017年下半年下午试卷

    软考解析:2017年下半年下午试卷 第一题:[数据流图] [问题3]根据说明及图中的术语和符号,补充图中缺失的数据流,并注明数据流的起点和终点. 第二题:[ER图] [问题1]根据问题描述,补充五个联 ...

最新文章

  1. java性能调优工具--笔记
  2. mysql 取 映射数据库中_JAVA与数据库MySQL相连接
  3. Codeforces Round #653 (Div. 3)
  4. 在Hadoop上运行基于RMM中文分词算法的MapReduce程序
  5. H.264学习历程(天之骄子)
  6. oracle数据库自动备份控制文件的目录,16.5 控制文件的自动备份和还原(1)
  7. JAVA 配合 Vue前台,完成中文、拼音全拼、拼音首字母检索
  8. Centos7与Windows查看硬盘序列号
  9. [不变初心数(15分] 用数组存储不变的数最后对照即可
  10. 大疆无人机飞控软件介绍
  11. 南京申瓯SOC1000-UC IPPBX为中小企业提供电话系统解决方案
  12. 优秀网页设计:20个国外大学网站设计欣赏
  13. contiki学习笔记 etimer部分
  14. 卡尔曼滤波 预测与测量我们更应该相信谁?
  15. CentOS VirtualBox虚拟机 系统时间不对
  16. 先定产权还是先定价格,数据交易场景下的市场设计问题,合作博弈中“沙普利值”
  17. Python数据可视化——词云图
  18. 电话一点通:基础电话用语(1)日常口语练习
  19. Anaconda安装老版本tensorflow
  20. 英语读书笔记-Book Lovers Day 08

热门文章

  1. 机器学习入门书籍导读-工程高等代数
  2. 区块链基础设施纵览:基本框架原则——揭示存储、计算和通信元素
  3. JMeter使用碰到的问题
  4. 从netty-example分析Netty组件
  5. 评分卡开发方法论scorecard
  6. Ubuntu18.04中Anaconda启动 Navigator
  7. mysql数据库密码转换_MySQL数据库root账户密码忘记两种处理方法转载
  8. 每日一博 - 如何理解跳表(SkipList)
  9. Redis进阶- Redisson分布式锁实现原理及源码解析
  10. Spring JDBC-NamedParameterJdbcTemplate模板类