c99和c++11相互调用
C99
C语言的发展历史大致上分为三个阶段:Old Style C、C89和C99。Ken Thompson和Dennis Ritchie发明C语言时有很多语法和现在并不一样,但为了向后兼容性(Backward Compatibility), 这些语法仍然在C89和C99中保留下来了。C89是最早的C语言规范,1990年由ANSI(美国国家标准委员会)推出ANSI版本,后来被接纳为ISO国际标准(ISO/IEC 9899:1990),因而有时也称为C90。C89是目前最广泛采用的C语言标准,大多数编译器都完全支持C89。C99标准(ISO/IEC 9899:1999)是在1999年推出的,加入了许多新的特性,但目前仍没有得到广泛支持。
inline
(内联)关键字该函数在代码内进行内联扩展,当代码执行时没有函数的进栈与退栈,函数执行速度加快。
新增数据类型
- 增加了用来定义
bool
、true
以及false
宏的头文件<stdbool.h> - 引进了
long long int
和unsigned long long int
- 增加了用来定义
可变长数组(VLA)
声明数组时,数组的维数可以由任一有效的整型表达式确定,包括只在运行时才能确定其值的表达式,这类数组就叫做可变长数组。只有局部数组才可以是变长的,且可变长数组的维数在数组生存期内不变。
预处理程序的修改
具有可变数目的参数的宏
#define report(test, ...) ((test)?puts(#test):printf(__VA_ARGS__))//定义report(x>y, “x is %d but y is %d”, x, y);//使用((x>y)?puts(“x>y”):printf(“x is %d but y is %d”, x, y))//结果
内部编译指令
STDC FP_CONTRACT ON/OFF/DEFAULT 若为ON,浮点表达式被当做基于硬件方式处理的独立单元STDC FEVN_ACCESS ON/OFF/DEFAULT 告诉编译程序可以访问浮点环境,默认值是定义的工具.STDC CX_LIMITED_RANGE ON/OFF/DEFAULT 若值为ON,相当于告诉编译程序某程序某些含有复数的公式是可靠的,默认是OFF
for语句内的变量声明
C99中,程序员可以在for语句的初始化部分定义一个或多个变量,这些变量的作用域仅于本for语句所控制的循环体内。在C89中,这样是不可以的。
复合赋值初始化符
数组的格式:[index] = vol,其中index表示数组的下标,vol表示本数组元素的初始化值。
int x[10] = {[0] = 10, [5] = 30};struct example{int k, m, n; } object = {m = 10, n = 200};
printf()和scanf()函数系列的增强
C99新增的标准库
__func__ 预定义标识符,用于指出__func__所存放的函数名
C++11
C++11是C++程序设计语言标准的一个新的版本,在2011年由ISO批准并发布。C++11新标准从而代替了原来的C++98和C++03.。C++11标准是对C++的一次巨大的改进和扩充。在核心语法,STL标准模板等方面增加众多新功能,新亮点。例如新增auto,deltype,nullptr等关键字,增加范围for循环,新增lambda表达式等。
auto关键字
引入了auto关键字,auto关键字可以让编译器自动分析某个初始值来判断它所属的类型。
decltype关键字
引入了类型说明符decltype,它使得编译器自动分析表达式的类型并得到它的类型,最关键是它不会去计算表达式的值。
字面值nullptr
引入了一个新的字面值来初始化空指针,nullptr是一个比较特殊的字面值,它可以任意转换成其他的任意指针类型。
范围for语句
范围for语句遍历指定序列的每个元素,并且可以对每个元素进行某种操作。
for(auto i: {1,2,3,4})printf("%d\n",i);
Lambda表达式
C++11新标准新增的一项重要功能就是lambda表达式,表示一个可调用的代码单元,也可以理解为一个没有命名的内联函数。Capture list 表示捕获列表,也就是lambda所在函数中的局部变量的列表。Return type 表示该lambda的返回类型,Parameter list 为形参列表,Function body是函数体。另外,lambda必须包括捕获列表和函数体,另外的几个可以省略。
[capture list] (parameter list) -> return type { function body}
initializer_list
Initializer_list定义在c++11新标准新引入的initializer_list头文件中,此类型用于访问c++初始化列表中的值,列表中的元素类型为const的。这种类型的对象由编译器从初始化列表声明中直接自动构造,所谓初始化列表声明就是被包括在花括号里面的,用逗号分隔元素的列表。
int a[3]{1,2,3};
智能指针shared_ptr,unique_ptr
标准库bind函数
C99和C++11相互调用
集成开发环境(IDE,Integrated Development Environment )是用于提供程序开发环境的应用程序,一般包括代码编辑器、 编译器 、 调试器和图形用户界面等工具,是集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套。
gcc
:Linux系统的默认C/C++编译器,可编译.c
和.cpp
。gcc
编译器支持C99
标准和C++11
标准g++
:实际调用gcc
编译.cpp
文件Dev-C++
:内嵌gcc
编译器(gcc
编译器的 Windows 移植版)VS2017
:对于C99
,不支持VLA变长数组,不支持指针的隐式类型转换,其他的没有测试。更重要的,它也不支持内联汇编代码,不识别__asm__
符号。对于C++11
支持良好。
C++11调用C99
为
C99
代码编写头文件,应符合C89
标准以兼容C++11
。包含头文件时,加上extern "C"
,告诉编译器用C的规则去调用函数。extern "C"{#include "xxx.h" }
将
C99
代码编译为动态库.dll
或者静态库.lib
。Dev
中,- 文件 - 新建 - 项目 - C项目 - 空工程
- 项目 - 项目属性 - 普通 - 类型 - 静态库/动态库
- 项目 - 项目属性 - 编译器 - 代码生成 - 语言标准 - C99
- 全部重新编译,得到
.lib
或者.dll
在
C++11
工程的库路径里,添加上述库文件。- 文件 - 新建 - 项目 - C++项目 - 空工程
- 项目 - 项目属性 - 普通 - 类型 - 控制台程序
- 项目 - 项目属性 - 编译器 - 代码生成 - 语言标准 - C++11
- 项目 - 项目属性 - 参数 - 链接 - 添加库或者对象
- 添加库的头文件,编写调用库函数的代码
- 全部重新编译,得到C++11的可执行程序
执行
C++11
程序
C99调用C++11
为
C++11
代码编写头文件,应符合C89
标准以兼容C99
。头文件中的函数声明要加上extern "C"{...}
,告诉编译器用C的规则编译函数。并且加上__cdecl
,使得编译中函数名不发生改变。extern "C"{void __cdecl func(); }
将
C++11
代码编译为动态库.dll
或者静态库.lib
。Dev
中,- 文件 - 新建 - 项目 - C++项目 - 空工程
- 项目 - 项目属性 - 普通 - 类型 - 静态库/动态库
- 项目 - 项目属性 - 编译器 - 代码生成 - 语言标准 - C++11
- 全部重新编译,得到
.lib
或者.dll
在
C99
工程的库路径里,添加上述库文件。- 文件 - 新建 - 项目 - C项目 - 空工程
- 项目 - 项目属性 - 普通 - 类型 - 控制台程序
- 项目 - 项目属性 - 编译器 - 代码生成 - 语言标准 - C99
- 项目 - 项目属性 - 参数 - 链接 - 添加库或者对象
- 添加库的头文件,编写调用库函数的代码
- 全部重新编译,得到C99的可执行程序
执行
C99
程序
问题
- 似乎
C++11
的静态库编译得到的xxx.a
文件无法在C99
中使用,报错new
,delete
未定义(这是为什么?) C++11
的动态库编译会得到三个文件libxxx.a
,libxxx.def
,xxx.dll
,C99
中使用静态库时可以添加libxxx.a
库文件- 这样不会报
new
,delete
未定义的错误了,但是有两个monstratup
,_mcleanup
重定义的错误。不知道么的,昨天一顿操作,这两个错误消失了,成功在C99
上执行C++11
的库代码。但今天一试,又出现这两个重定义的错误了~~~ - OHHH,我知道了,
monstratup
这些函数是用来性能分析的,在.lib
生成的时候,记得把设置:项目 - 项目属性 - 编译器 - 代码性能 - 性能分析 - No。只在exe工程里,将上述的设置为Yes。
c99和c++11相互调用相关推荐
- C#与Javascript变量、函数之间的相互调用2008年11月28日 星期五 05:28 P.M.1.如何在JavaScript访问C#函数?
C#与Javascript变量.函数之间的相互调用 2008年11月28日 星期五 05:28 P.M. 1.如何在JavaScript访问C#函数? 2.如何在JavaScript访问C#变量? 3 ...
- python模块--如何相互调用自己写的模块
一.模块相互调用同级目录调用时的两种方法 1 import module 2 print(module.add(3,8)) 3 4 from module import add 5 print(add ...
- C#代码与javaScript函数的相互调用
C#代码与javaScript函数的相互调用 问: 1.如何在JavaScript访问C#函数? 2.如何在JavaScript访问C#变量? 3.如何在C#中访问JavaScript的已有变量? 4 ...
- Python与C之间的相互调用
Python与C之间的相互调用(Python C API及Python ctypes库) 分类: [Python]2010-01-24 17:58 32468人阅读 评论(11) 收藏 举报 pyth ...
- jni c java互相调用_通过JNI实现Java和C++的相互调用
评论 # re: 通过JNI实现Java和C++的相互调用 2008-07-29 14:14 Always BaNg. 不错,把字符转换也一并讲了吧,比如UTF-8的处理,USC-2与MBCS转换等. ...
- .net中C#代码与javaScript函数的相互调用问题
.net中C#代码与javaScript函数的相互调用问题. 问: 1.如何在JavaScript访问C#函数? 2.如何在JavaScript访问C#变量? 3.如何在C#中访问JavaScript ...
- 父子页面iframe相互调用方法详解
2019独角兽企业重金招聘Python工程师标准>>> 如果你采用嵌入iframe机制,不可避免的要用到各个iframe页面之间方法和属性的相互调用.这里介绍的是兼容各个浏览器的if ...
- Spring Cloud之微服务之间相互调用、如何让一个微服务调用另外一个微服务
在使用微服务架构中,可能遇到一些业务情况会涉及服务之间相互调用,下面通过一个简单的demo给大家演示下,演示的是oms服务需要调用ump服务. 代码如下: 1.oms服务提供者 主要是这个注解: @E ...
- 【问链-EOS公开课】第十一课 EOS 智能合约相互调用
EOS中合约之间是可以相互调用的,主要通过inline action完成合约之间的调用. 譬如在掷骰子游戏中,存在两个玩家先下注资金,然后比较骰子大小后决定胜负,赢的那一方将获得所有的下注资金.在eo ...
- 嵌入式:ARM内嵌汇编及C和ARM汇编相互调用
内嵌汇编 在C程序中嵌入汇编程序可以实现一些高级语言没有的功能,并可以提高执行效率.armcc和armcpp内嵌汇编器支持完整的ARM指令集:tcc和tcpp用于Thumb指集.但是内嵌汇编器并不支持 ...
最新文章
- ogg oracle to mysql_ogg oracle to mysql
- SAP WM Storage Type下不允许负库存的设置
- JAVA IF判断语句
- python图像处理专业博客
- Dev-C++实现调试功能
- 《数据库SQL实战》获取所有部门当前manager的当前薪水情况
- android版本如何修改时间,如何修改Android系统默认时间
- leetcode1437. 是否所有 1 都至少相隔 k 个元素
- python书籍推荐:Head First Python(中文版)
- Lisp-Stat翻译 —— 第十章 一些动态绘图实例
- 各种说明方法的答题格式_说明文方法答题格式
- 2020年全球柿子产业发展概述及产业发展趋势分析[图]
- Attention-Based Recurrent Neural Network Models for Joint Intent Detection and Slot Filling论文笔记
- 《信息物理融合系统(CPS)设计、建模与仿真——基于 Ptolemy II 平台》——3.2 动态数据流...
- 一元函数、多元函数的泰勒公式
- 长短期记忆网络(LSTM)简述
- 程序员如何与产品撕逼
- 大学html5毕业设计任务书,2021届本科生毕业设计(论文)工作的通知
- holder.js占位图片生成器
- Synaptic dynamic