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年推出的,加入了许多新的特性,但目前仍没有得到广泛支持。

  1. inline(内联)关键字

    该函数在代码内进行内联扩展,当代码执行时没有函数的进栈与退栈,函数执行速度加快。

  2. 新增数据类型

    1. 增加了用来定义booltrue以及false宏的头文件<stdbool.h>
    2. 引进了long long intunsigned long long int
  3. 可变长数组(VLA)

    声明数组时,数组的维数可以由任一有效的整型表达式确定,包括只在运行时才能确定其值的表达式,这类数组就叫做可变长数组。只有局部数组才可以是变长的,且可变长数组的维数在数组生存期内不变。

  4. 预处理程序的修改

    1. 具有可变数目的参数的宏

      #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))//结果
      
    2. 内部编译指令

      STDC FP_CONTRACT ON/OFF/DEFAULT
      若为ON,浮点表达式被当做基于硬件方式处理的独立单元STDC FEVN_ACCESS ON/OFF/DEFAULT
      告诉编译程序可以访问浮点环境,默认值是定义的工具.STDC CX_LIMITED_RANGE ON/OFF/DEFAULT
      若值为ON,相当于告诉编译程序某程序某些含有复数的公式是可靠的,默认是OFF
      
  5. for语句内的变量声明

    C99中,程序员可以在for语句的初始化部分定义一个或多个变量,这些变量的作用域仅于本for语句所控制的循环体内。在C89中,这样是不可以的。

  6. 复合赋值初始化符

    数组的格式:[index] = vol,其中index表示数组的下标,vol表示本数组元素的初始化值。

    int x[10] = {[0] = 10, [5] = 30};struct example{int k, m, n;
    } object = {m = 10, n = 200};
    
  7. printf()和scanf()函数系列的增强

  8. C99新增的标准库

  9. __func__ 预定义标识符,用于指出__func__所存放的函数名

C++11

C++11是C++程序设计语言标准的一个新的版本,在2011年由ISO批准并发布。C++11新标准从而代替了原来的C++98和C++03.。C++11标准是对C++的一次巨大的改进和扩充。在核心语法,STL标准模板等方面增加众多新功能,新亮点。例如新增auto,deltype,nullptr等关键字,增加范围for循环,新增lambda表达式等。

  1. auto关键字

    引入了auto关键字,auto关键字可以让编译器自动分析某个初始值来判断它所属的类型。

  2. decltype关键字

    引入了类型说明符decltype,它使得编译器自动分析表达式的类型并得到它的类型,最关键是它不会去计算表达式的值。

  3. 字面值nullptr

    引入了一个新的字面值来初始化空指针,nullptr是一个比较特殊的字面值,它可以任意转换成其他的任意指针类型。

  4. 范围for语句

    范围for语句遍历指定序列的每个元素,并且可以对每个元素进行某种操作。

    for(auto i: {1,2,3,4})printf("%d\n",i);
    
  5. Lambda表达式

    C++11新标准新增的一项重要功能就是lambda表达式,表示一个可调用的代码单元,也可以理解为一个没有命名的内联函数。Capture list 表示捕获列表,也就是lambda所在函数中的局部变量的列表。Return type 表示该lambda的返回类型,Parameter list 为形参列表,Function body是函数体。另外,lambda必须包括捕获列表和函数体,另外的几个可以省略。

    [capture list] (parameter list) -> return type { function body}
    
  6. initializer_list

    Initializer_list定义在c++11新标准新引入的initializer_list头文件中,此类型用于访问c++初始化列表中的值,列表中的元素类型为const的。这种类型的对象由编译器从初始化列表声明中直接自动构造,所谓初始化列表声明就是被包括在花括号里面的,用逗号分隔元素的列表。

    int a[3]{1,2,3};
    
  7. 智能指针shared_ptr,unique_ptr

  8. 标准库bind函数

C99和C++11相互调用

集成开发环境(IDE,Integrated Development Environment )是用于提供程序开发环境的应用程序,一般包括代码编辑器、 编译器 、 调试器和图形用户界面等工具,是集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套。

  1. gcc:Linux系统的默认C/C++编译器,可编译.c.cppgcc编译器支持C99标准和C++11标准

  2. g++:实际调用gcc编译.cpp文件

  3. Dev-C++:内嵌gcc编译器(gcc编译器的 Windows 移植版)

  4. VS2017:对于C99,不支持VLA变长数组,不支持指针的隐式类型转换,其他的没有测试。更重要的,它也不支持内联汇编代码,不识别__asm__符号。对于C++11支持良好。

C++11调用C99

  1. C99代码编写头文件,应符合C89标准以兼容C++11。包含头文件时,加上extern "C",告诉编译器用C的规则去调用函数。

    extern "C"{#include "xxx.h"
    }
    
  2. C99代码编译为动态库.dll或者静态库.libDev中,

    1. 文件 - 新建 - 项目 - C项目 - 空工程
    2. 项目 - 项目属性 - 普通 - 类型 - 静态库/动态库
    3. 项目 - 项目属性 - 编译器 - 代码生成 - 语言标准 - C99
    4. 全部重新编译,得到.lib或者.dll
  3. C++11工程的库路径里,添加上述库文件。

    1. 文件 - 新建 - 项目 - C++项目 - 空工程
    2. 项目 - 项目属性 - 普通 - 类型 - 控制台程序
    3. 项目 - 项目属性 - 编译器 - 代码生成 - 语言标准 - C++11
    4. 项目 - 项目属性 - 参数 - 链接 - 添加库或者对象
    5. 添加库的头文件,编写调用库函数的代码
    6. 全部重新编译,得到C++11的可执行程序
  4. 执行C++11程序

C99调用C++11

  1. C++11代码编写头文件,应符合C89标准以兼容C99。头文件中的函数声明要加上extern "C"{...},告诉编译器用C的规则编译函数。并且加上__cdecl ,使得编译中函数名不发生改变。

    extern "C"{void __cdecl func();
    }
    
  2. C++11代码编译为动态库.dll或者静态库.libDev中,

    1. 文件 - 新建 - 项目 - C++项目 - 空工程
    2. 项目 - 项目属性 - 普通 - 类型 - 静态库/动态库
    3. 项目 - 项目属性 - 编译器 - 代码生成 - 语言标准 - C++11
    4. 全部重新编译,得到.lib或者.dll
  3. C99工程的库路径里,添加上述库文件。

    1. 文件 - 新建 - 项目 - C项目 - 空工程
    2. 项目 - 项目属性 - 普通 - 类型 - 控制台程序
    3. 项目 - 项目属性 - 编译器 - 代码生成 - 语言标准 - C99
    4. 项目 - 项目属性 - 参数 - 链接 - 添加库或者对象
    5. 添加库的头文件,编写调用库函数的代码
    6. 全部重新编译,得到C99的可执行程序
  4. 执行C99程序

问题

  1. 似乎C++11的静态库编译得到的xxx.a文件无法在C99中使用,报错new, delete未定义(这是为什么?)
  2. C++11的动态库编译会得到三个文件libxxx.a, libxxx.def, xxx.dllC99中使用静态库时可以添加libxxx.a库文件
  3. 这样不会报new, delete未定义的错误了,但是有两个monstratup, _mcleanup重定义的错误。不知道么的,昨天一顿操作,这两个错误消失了,成功在C99上执行C++11的库代码。但今天一试,又出现这两个重定义的错误了~~~
  4. OHHH,我知道了,monstratup这些函数是用来性能分析的,在.lib生成的时候,记得把设置:项目 - 项目属性 - 编译器 - 代码性能 - 性能分析 - No。只在exe工程里,将上述的设置为Yes。

c99和c++11相互调用相关推荐

  1. 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 ...

  2. python模块--如何相互调用自己写的模块

    一.模块相互调用同级目录调用时的两种方法 1 import module 2 print(module.add(3,8)) 3 4 from module import add 5 print(add ...

  3. C#代码与javaScript函数的相互调用

    C#代码与javaScript函数的相互调用 问: 1.如何在JavaScript访问C#函数? 2.如何在JavaScript访问C#变量? 3.如何在C#中访问JavaScript的已有变量? 4 ...

  4. Python与C之间的相互调用

    Python与C之间的相互调用(Python C API及Python ctypes库) 分类: [Python]2010-01-24 17:58 32468人阅读 评论(11) 收藏 举报 pyth ...

  5. jni c java互相调用_通过JNI实现Java和C++的相互调用

    评论 # re: 通过JNI实现Java和C++的相互调用 2008-07-29 14:14 Always BaNg. 不错,把字符转换也一并讲了吧,比如UTF-8的处理,USC-2与MBCS转换等. ...

  6. .net中C#代码与javaScript函数的相互调用问题

    .net中C#代码与javaScript函数的相互调用问题. 问: 1.如何在JavaScript访问C#函数? 2.如何在JavaScript访问C#变量? 3.如何在C#中访问JavaScript ...

  7. 父子页面iframe相互调用方法详解

    2019独角兽企业重金招聘Python工程师标准>>> 如果你采用嵌入iframe机制,不可避免的要用到各个iframe页面之间方法和属性的相互调用.这里介绍的是兼容各个浏览器的if ...

  8. Spring Cloud之微服务之间相互调用、如何让一个微服务调用另外一个微服务

    在使用微服务架构中,可能遇到一些业务情况会涉及服务之间相互调用,下面通过一个简单的demo给大家演示下,演示的是oms服务需要调用ump服务. 代码如下: 1.oms服务提供者 主要是这个注解: @E ...

  9. 【问链-EOS公开课】第十一课 EOS 智能合约相互调用

    EOS中合约之间是可以相互调用的,主要通过inline action完成合约之间的调用. 譬如在掷骰子游戏中,存在两个玩家先下注资金,然后比较骰子大小后决定胜负,赢的那一方将获得所有的下注资金.在eo ...

  10. 嵌入式:ARM内嵌汇编及C和ARM汇编相互调用

    内嵌汇编 在C程序中嵌入汇编程序可以实现一些高级语言没有的功能,并可以提高执行效率.armcc和armcpp内嵌汇编器支持完整的ARM指令集:tcc和tcpp用于Thumb指集.但是内嵌汇编器并不支持 ...

最新文章

  1. ogg oracle to mysql_ogg oracle to mysql
  2. SAP WM Storage Type下不允许负库存的设置
  3. JAVA IF判断语句
  4. python图像处理专业博客
  5. Dev-C++实现调试功能
  6. 《数据库SQL实战》获取所有部门当前manager的当前薪水情况
  7. android版本如何修改时间,如何修改Android系统默认时间
  8. leetcode1437. 是否所有 1 都至少相隔 k 个元素
  9. python书籍推荐:Head First Python(中文版)
  10. Lisp-Stat翻译 —— 第十章 一些动态绘图实例
  11. 各种说明方法的答题格式_说明文方法答题格式
  12. 2020年全球柿子产业发展概述及产业发展趋势分析[图]
  13. Attention-Based Recurrent Neural Network Models for Joint Intent Detection and Slot Filling论文笔记
  14. 《信息物理融合系统(CPS)设计、建模与仿真——基于 Ptolemy II 平台》——3.2 动态数据流...
  15. 一元函数、多元函数的泰勒公式
  16. 长短期记忆网络(LSTM)简述
  17. 程序员如何与产品撕逼
  18. 大学html5毕业设计任务书,2021届本科生毕业设计(论文)工作的通知
  19. holder.js占位图片生成器
  20. Synaptic dynamic

热门文章

  1. 微信电脑版调整字体大小的办法
  2. 五子棋c语言策划书活动内容,五子棋比赛活动的策划案
  3. NLP ---文本情感分析
  4. 机器学习(一) Eviews下载及安装教程
  5. JSON格式化软件 - 开源工具 JSON Viewer
  6. AD元件库安装与使用
  7. 合并报表软件系统_报表难题统统扫除!
  8. 量子计算机慕课,计算机组成原理-中国大学mooc-题库零氪
  9. 网页数据导出为Excel(带图片)
  10. KeyTool生成证书链及使用