C++基础学习之7 - 与C程序对话
来源:互联网 发布:侠盗飞车作弊软件 编辑:程序博客网 时间:2024/05/18 03:18
C++当初设计该语言的初衷是 “C”扩展,所以C++一般被认为是C的超集,但“这并不意味着C++兼容C语言的所有东西”。C++保留了一部分过程式语言的特点,大部分的C代码可以很轻易地在C++中正确编译,但仍有少数差异,导致某些有效的C代码在C++中无法通过编译。因此,从C到C++,我们要因为这些差异而做出一些改变,我们应当熟悉这些差异,使用原有的丰富的C库为现在的C++工程更好地服务。那么在C++程序中是否可以调用C程序代码呢?
先不置可否,我们来看 C程序与C++程序不同的编译方式:
对于下面的函数:
void func_add(int a,int b);C程序在编译时会生成 _func_add 类型的符号;
C++程序在编译时会生成 _func_add_int_int 类型的符号(这种机制为C++的函数重载提供了支持);
这种符号不一致导致我们无法直接调用,我们在C++中调用C程序代码会出现问题,error LNK2019: 无法解析的外部符号,很熟悉吧。
解决方案有木有?有,这里面的桥梁就是 extern “C”修饰符 。extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。被extern "C" 修饰的变量和函数要按照C语言方式进行编译和链接。
在CPP中调用时,通过添加 extern “C” 指定里面的函数按照C风格编译:
/** c语言头文件:CAdd.h */#ifndef C_ADD_H#define C_ADD_H extern int add(int a,int b);#endif/** C语言实现文件:CAdd.c */#include "CAdd.h"int add(int a,int b){ return a+b;}/** C++实现文件,调用add*/extern "C"{#include "CAdd.h"}int main(int argc, char* argv[]){ add(2,3); return 0;}
同样,当C++调用一个C生成的 DLL 时,也需要参照上面的方法修饰。
我们在编写C代码的时候,由于在C语言中不支持 extern "C" 声明,为了让头文件同时兼容C和C++,我们一般会这样来实现:
#ifdef __cplusplusextern "C" {#endifint add (int a, int b);#ifdef __cplusplus}#endif通过添加 宏__cplusplus 进行条件判断,我们能够有效保证 头文件能够在C和C++中同时使用。
- C++基础学习之7 - 与C程序对话
- Linux C基础学习之autoconf与automake
- 学习笔记:C程序基础(1)
- 学习笔记:C程序基础(2)
- 学习笔记:C程序基础(3)
- c语言基础之小程序
- 回归基础之C语言程序1
- C语言学习之基础学习01
- C语言程序基础
- C程序基础
- objective-c基础语法学习之--(7)拷贝对象
- 学习笔记之C语言基础篇
- 嵌入式linux-C学习之基础
- iphone开发基础之objective-c学习
- java学习之C语言基础2
- 数据结构学习笔记之C指针基础
- 学习Objective-C之基础数据结构
- C/C++之基础学习笔记
- 制作水果忍者-JS-2
- 【微信小程序】事件交互案例演示
- linux-kernel配置命令
- HEVC部分通测序列特点
- 集合框架_HashMap集合键是Student值是String的案例
- C++基础学习之7 - 与C程序对话
- Python基础1
- 2017.1.12会议笔记
- 在做性能测试之前需要知道什么
- 适配器模式
- 【Redis学习】:Redis数据类型
- 第25课 Python文件读操作
- xml操作(四) 遍历XML的节点
- 原型模式(Prototype Pattern)的用户以及示例demo