Component之C++

首先,VxWorks支持C++编程,毕竟面向对象语言功能强大。不过因为性能的原因,在实时系统里,更多的还是使用C语言来编程。尤其在信号和中断处理函数里调用C++的话,一些动态行为不能使用,例如非静态成员函数、实例化对象、删除对象、exception、run-time type identification(RTTI)等

VxWorks中的C++组件有

  • INCLUDE_CTORS_DTORS - 默认包含,确保内核启动时调用编译器生成的初始化函数(包含C++静态对象的初始化)
  • INCLUDE_CPLUS - C++应用的基本支持,通常与INCLUDE_CPLUS_LANG一起使用
  • INCLUDE_CPLUS_LANG - C++语言特性的支持,例如new、delete、异常处理等
  • INCLUDE_CPLUS_IOSTREAMS - 包含所有类库功能
  • INCLUDE_CPLUS_DEMANGLER - C++符号的还原(demangler),使用Kernel Shell加载器时,会用到它。使用INCLUDE_CPLUS和INCLUDE_SYM_TBL时,会包含它

风河集成的两个编译器(diab和gnu)都支持C++,不过它俩基于C++源码编译得到二进制文件并不兼容!当然也包括它俩的C++系统库libcplus.a

另外,它俩的头文件也不相同,而且各自使用自己的路径,而不是系统的target/h

不过开发者不用关心这些信息,编译器会自动识别、自动查找它们的 ^_^

开发者需要注意的是,在启动包含了C++的任务时,需要包含VX_FP_TASK选项,因为C++的异常处理机制使用了浮点寄存器。否则上下文切换时,系统不会保存/恢复浮点寄存器的值,就有可能出现意想不到的错误

幸运的是,Host端的工具(例如Host Shell)默认包含了这个选项

因为C++支持函数重载,这样经过编译器编译后,符号表中的函数名肯定不能与源码中的函数名一致,因此C文件中无法直接访问C++的符号。为了解决这个问题,C++的符号需要使用extern "C"来声明

看个例子

在头文件中,使用宏__cplusplus来声明函数,这样C++和C文件都可以引用它

C++函数如下

C函数如下

跑一下试试

可以看到C与C++相互调用成功了: C里的funC1()调用了C++的funCpp1();funCpp1()又调用了C的funC0()

这正是:

支持但不是推荐,性能要考虑优先。

任务需使能浮点,声明兼容C语言。

本文分享自微信公众号 - 这里只有VxWorks(VxWorks567)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-06-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 程序员C语言快速上手——基础篇(二)

    在代码目录下打开cmd命令行或打开VSCode中的命令行,VS Code快捷键是【Ctrl】+【~】

    arcticfox
  • 【C语言笔记】windows命令行下编译C程序

    有关注我的朋友可能会知道我的C开发环境是:Notepad++与MinGW相结合,即用Notepad++写代码,用MinGW这个工具包中的gcc编译器进行编译。如...

    正念君
  • 【C语言笔记】函数指针作为函数的参数

    函数指针有两种常用的用法,一种是作为结构体成员,关于函数指针作为结构体成员的用法可移步至上一篇【C语言笔记】函数指针作为结构体成员进行查看。另一种是函数指针作为...

    正念君
  • 【C语言笔记】函数指针作为结构体成员

    在C语言程序中,数据结构和算法是两个基本的元素。C语言的基本数据类型、结构体、数组和联合体是数据结构的代表;C语言中的函数则是算法的代表。只有将数据结构和算法有...

    正念君
  • 【C语言笔记】位域

    有些数据在存储时并不需要占用一个完整的字节,只需要占用一个或几个二进制位即可。例如开关只有通电和断电两种状态,用 0 和 1 表示足以,也就是用一个二进位。正是...

    正念君
  • 【C语言笔记】extern关键字

    extern “C”的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern “C”后,会指示编译器这部分代码按C语言的进行编译,而不是C+...

    正念君
  • 程序员C语言快速上手——环境准备篇(一)

    大多数人在Windows上使用Visual Studio IDE作为C语言学习环境,实际上我认为这是非常错误的做法。每个人都有各自的理由,比如学校是这么教的,要...

    arcticfox
  • 【C语言笔记】内存笔记

    C语言程序需要载入内存才可以运行,其不同的数据保存在不同的区域。所使用的内存可以分成两类:一类是静态存储区,另一类是动态存储区。

    正念君
  • 【C语言笔记】结构体

    我们都知道C语言中变量的类型决定了变量存储占用的空间。当我们要使用一个变量保存年龄时可以将其声明为int类型,当我们要使用一个变量保存某一科目的考试成绩时可以将...

    正念君
  • LeetCode-27 移除元素

    今天我们学习第27题移除元素,这个题目和昨天的LeetCode-26 删除排序数组中的重复项原理一样。我们先看看这道题的题目描述。

    用户3470542

扫码关注云+社区

领取腾讯云代金券