大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是MCUXpresso IDE下C++源文件中嵌套定义的复合数据类型命名空间认定

  痞子衡之前写过一篇文章 《MCUXpresso IDE下添加C++源文件进SDK工程编译的方法》,通过这篇文章我们知道嵌入式工程里是能够支持 C 源文件和 C++ 源文件混合编译的(因为有很多开源的库是基于 C++ 语言的,我们需要移植到嵌入式工程里)。

  最近有一个 RW612 客户在使用官方 SDK 时就遇到一个 C/C++ 混合编译问题,主要涉及复合数据类型(结构体、联合体、枚举)嵌套定义时的命名空间范围认定,今天我们就来聊一聊这个话题:

  • Note1:测试软件版本为 MCUXpresso IDE v11.10.0_3133
  • Note2:该问题普遍存在于不同 IDE 编译器,非 GCC 专属

一、引出编译问题

  客户使用得是 SDK_2_16_000_RD-RW612-BGA 开发包里的基础 hello_world 例程模板,当客户尝试在工程里添加自己创建的 C++ 源文件,并且在该 C++ 源文件中使用 fsl_clock.h 里声明的如下 clock_frg_clk_config_t 复合数据类型时遇到了编译错误:

typedef struct _clock_frg_clk_config
{
uint8_t num;
enum
{
kCLOCK_FrgMainClk = 0,
kCLOCK_FrgPllDiv,
kCLOCK_FrgSFro,
kCLOCK_FrgFFro,
} sfg_clock_src;
uint8_t divider;
uint8_t mult;
} clock_frg_clk_config_t;

  客户出现问题的 C++ 源代码也足够简单,只是定义了 clock_frg_clk_config_t 类型的变量 frg_config,并对其中 sfg_clock_src 成员进行赋值,结果编译报错 'kCLOCK_FrgPllDiv' was not declared in this scope

clock_frg_clk_config_t frg_config;
frg_config.sfg_clock_src = kCLOCK_FrgPllDiv;

  当我们尝试在 C 源代码里使用相同的代码时,编译是没问题的,因此可知 clock_frg_clk_config_t 结构体里直接嵌套的 sfg_clock_src 枚举类型申明在 C 编译器(arm-none-eabi-gcc)下命名空间是整个文件,而在 C++ 编译器(arm-none-eabi-c++)下命名空间仅在 clock_frg_clk_config_t 结构体内。

二、解决编译问题

  知道了编译问题和命名空间有关,要解决问题,那就通过 C++ 的作用域解析运算符 :: 来解决,修改代码如下,此时编译正常。但是这样是完美的解决方案吗?很显然,同样功能的代码,在 C/C++ 源文件里写法不一致,这看起来很别扭。

clock_frg_clk_config_t frg_config;
frg_config.sfg_clock_src = clock_frg_clk_config_t::kCLOCK_FrgPllDiv;

  什么是更好的解决方案?答案就是单独申明每个复合数据类型原型,让所有复合数据类型命名空间都一样,这样我们统一用 C 语言语法即可。实际上在恩智浦官方 SDK 里一直是这样的设计准则,客户遇到的这个情况是个“美丽”的意外。

typedef enum _sfg_clock_src
{
kCLOCK_FrgMainClk = 0,
kCLOCK_FrgPllDiv,
kCLOCK_FrgSFro,
kCLOCK_FrgFFro,
} sfg_clock_src_t; typedef struct _clock_frg_clk_config
{
uint8_t num;
sfg_clock_src_t sfgClockSrc
uint8_t divider;
uint8_t mult;
} clock_frg_clk_config_t;

  至此,MCUXpresso IDE下C++源文件中嵌套定义的复合数据类型命名空间认定痞子衡便介绍完毕了,掌声在哪里~~~

欢迎订阅

文章会同时发布到我的 博客园主页CSDN主页知乎主页微信公众号 平台上。

微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。

痞子衡嵌入式:MCUXpresso IDE下C++源文件中嵌套定义的复合数据类型命名空间认定的更多相关文章

  1. 痞子衡嵌入式:在SBL项目实战中妙用i.MXRT1xxx里SystemReset不复位的GPR寄存器

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1xxx里SystemReset不复位的GPR寄存器的小妙用. 我们知道稍大规模的项目代码设计一般都是多人协作完成的,在项目 ...

  2. 痞子衡嵌入式:MCUXpresso IDE下添加新路径下源文件进工程编译的方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE下添加新路径下源文件进工程编译的方法. 接着上篇文章 <MCUXpresso IDE下SDK工程导入与 ...

  3. 痞子衡嵌入式:MCUXpresso IDE下添加C++源文件进SDK工程编译的方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE下添加C++源文件进SDK工程编译的方法. 最近有客户反映在MCUXpresso IDE下的SDK工程里添加 ...

  4. 痞子衡嵌入式:MCUXpresso IDE下使用J-Link下载算法在Flash调试注意事项(i.MXRT500为例)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE下使用J-Link下载算法在Flash调试注意事项. 痞子衡前段时间写过一篇小文<为i.MXRT设计更 ...

  5. 痞子衡嵌入式:MCUXpresso IDE下SDK工程导入与workspace管理机制

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE下SDK工程导入与workspace管理机制. MCUXpresso IDE是恩智浦软件团队倾注很大心血研发 ...

  6. 痞子衡嵌入式:MCUXpresso IDE下SDK工程在Build配置上与IAR,MDK差异

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE下SDK工程在Build配置上与IAR,MDK差异. 恩智浦 SW 团队每个季度都会公布 SDK.Tool ...

  7. 痞子衡嵌入式:MCUXpresso IDE下工程链接文件配置管理与自动生成机制

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE下工程链接文件配置管理与自动生成机制. 痞子衡在 2018 年初写过一个专题 <嵌入式开发文件系列&g ...

  8. 痞子衡嵌入式:MCUXpresso IDE下将应用程序RW段分散链接的几种方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE下将应用程序RW段分散链接的几种方法. 早期的 MCU 芯片,一般都会嵌入内部 Flash 和 RAM,并且 ...

  9. 痞子衡嵌入式:MCUXpresso IDE下将关键函数重定向到RAM中执行的几种方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是MCUXpresso IDE下将关键函数重定向到RAM中执行的几种方法. 前段时间痞子衡写了一篇 <在IAR开发环境下将关键函数重 ...

  10. 痞子衡嵌入式:MCUXpresso IDE下将源码制作成Lib库方法及其与IAR,MDK差异

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是MCUXpresso IDE下将源码制作成Lib库方法及其与IAR,MDK差异. 程序函数库是一个包含已经编译好代码和数据的函数集合,这 ...

随机推荐

  1. 从0到1搭建权限管理系统系列四 .net8 中Autofac的使用(附源码)

    说明 该文章是属于OverallAuth2.0系列文章,每周更新一篇该系列文章(从0到1完成系统开发). 该系统文章,我会尽量说的非常详细,做到不管新手.老手都能看懂. 说明:OverallAuth2 ...

  2. excel江湖异闻录--渣渣

    有朋友问过我,为什么要写这些,细细思量,一来我喜欢这个纯粹的江湖,二则向这些纯粹的高手.大神致敬,三是纪念一下自己学习EXCEL的历程. 其实,每一个篇章都有一个逻辑,只不过这个逻辑,不是按照实力的高 ...

  3. ABC270-d

    题目 首先贪心是行不通的,考试的时候打了贪心,挂了...... 举个反例: 10 2 3 4 贪心枚举答案为4,但若高桥先选3,最大值为6. 其实考试的时候想到了dp,但是不会打 悲 因为青木也是聪明 ...

  4. Python 实现Excel XLS和XLSX格式相互转换

    在日常工作中,我们经常需要处理和转换不同格式的Excel文件,以适应不同的需求和软件兼容性.Excel文件的两种常见格式是XLS(Excel 97-2003)和XLSX(Excel 2007及以上版本 ...

  5. 关于uniapp的兼容性的一些问题

    .markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...

  6. Java 当中使用 “google.zxing ”开源项目 和 “github 的 qrcode-plugin” 开源项目 生成二维码

    Java 当中使用 "google.zxing "开源项目 和 "github 的 qrcode-plugin" 开源项目 生成二维码 @ 目录 Java 当中 ...

  7. Buffer和Channel

    IO 和 NIO 区别: 可简单认为:IO 是面向流的处理,NIO 是面向块(缓冲区)的处理 面向流的 I/O 系统一次一个字节地处理数据. 一个面向块(缓冲区)的 I/O 系统以块的形式处理数据. ...

  8. 将NC栅格表示时间维度的数据提取出来的方法

      本文介绍基于Python语言,逐一读取大量.nc格式的多时相栅格文件,导出其中所具有的全部时间信息的方法.   .nc是NetCDF(Network Common Data Form)文件的扩展名 ...

  9. 2024年全国大学生信息安全竞赛安徽省赛-WP

    2024年全国大学生信息安全竞赛安徽省赛-WP 没有re,不会...... 0X01 初赛(CTF) MISC 图像损坏 损坏的GIF文件,补上缺失的文件头 ​​ 用puzz拆分GIF,得到多个图片 ...

  10. 一些有用的shell命令组合

    1.找出Linux系统中磁盘占用最大的10个文件 1)CentOS7 和 busybox 1.30.1 验证可用 find / -type f -print0 | xargs -0 du | sort ...