[面试] C/C++ 语法(五) —— extern

1. C 调用 C++ 开发的DLL库

C和C++混合编程(__cplusplus 与 external “c” 的使用)

#ifdef __cplusplus

extern "C" {

#endif

/**** some declaration or so *****/

#ifdef __cplusplus

  }

#endif /* end of __cplusplus */

除了对类的支持和面向对象的相关语法,C++ 与 C 还存在一些无法兼容的差异,由于CPP支持多态性,也就是具有相同函数名的函数可以完成不同的功能,CPP通常是通过参数区分具体调用的是哪一个函数。在编译的时候,CPP编译器会将参数类型和函数名连接在一起,于是在程序编译成为目标文件以后,CPP编译器可以直接根据目标文件中的符号名将多个目标文件连接成一个目标文件或者可执行文件。但是在C语言中,由于完全没有多态性的概念,C编译器在编译时除了会在函数名前面添加一个下划线之外,什么也不会做(至少很多编译器都是这样干的)。由于这种的原因,当采用CPP与C混合编程的时候,就可能会出问题。假设在某一个头文件中定义了这样一个函数:

int foo(int a, int b);

而这个函数的实现位于一个.c文件中,同时,在.cpp文件中调用了这个函数。那么,当CPP编译器编译这个函数的时候,就有可能会把这个函数名改成_fooii(多态性,函数名+参数类型联合指定),这里的ii表示函数的第一参数和第二参数都是整型。而C编译器却有可能将这个函数名编译成_foo。也就是说,在CPP编译器得到的目标文件中,foo()函数是由_fooii符号来引用的,而在C编译器生成的目标文件中,foo()函数是由_foo指代的。

最新文章

  1. nginx的日常应用
  2. Android 学习笔记
  3. nmap端口状态解析
  4. aehyok.com的成长之路一——开篇
  5. 解决 winform 界面对不齐 z
  6. 命令行界面下的用户和组管理之useradd和passwd命令的使用
  7. BeanFactory学习
  8. Windows上Python3.5安装Scrapy(lxml)
  9. python源文件转换成exe问题解决贴
  10. 打开word时出现the setup controller has encountered a problem during install解决办法
  11. 关于django1.8版本的静态文件配置
  12. VS2017
  13. Apk反编译助手
  14. linux基础知识的总结
  15. Windows下Linux 环境 Cygwin安装及配置 基本工具使用
  16. 亲热接触Redis-第二天(Redis Sentinel)
  17. VMware Workstation 14创建mac-10.12虚拟机详细步骤
  18. Quartz2D知识点聚合案例
  19. C# 设计模式,工厂方法
  20. Redis未授权访问漏洞复现

热门文章

  1. jenkins构建一个go项目
  2. HttpWebRequest用法实例
  3. C#各种导入Excel文件的数据的方法总结
  4. shell查看系统基本信息脚本
  5. InputFormat的认识
  6. ios美颜 调研 GPUImage GPUImageBeautifyFilter BeautifyFaceDemo
  7. os引导程序boot 在根目录区寻找os加载程序文件loader 对应的根目录条目
  8. ios -- 极光推送《1》
  9. android -volley-请求数据
  10. python 基础 1.4 python运算符