IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> c99和c++11相互调用 -> 正文阅读

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

  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。
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-04 11:50:13  更:2022-04-04 11:55:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 0:04:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码