痞子衡嵌入式:MCUXpresso IDE下C++源文件中嵌套定义的复合数据类型命名空间认定
大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是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++源文件中嵌套定义的复合数据类型命名空间认定的更多相关文章
- 痞子衡嵌入式:在SBL项目实战中妙用i.MXRT1xxx里SystemReset不复位的GPR寄存器
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1xxx里SystemReset不复位的GPR寄存器的小妙用. 我们知道稍大规模的项目代码设计一般都是多人协作完成的,在项目 ...
- 痞子衡嵌入式:MCUXpresso IDE下添加新路径下源文件进工程编译的方法
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE下添加新路径下源文件进工程编译的方法. 接着上篇文章 <MCUXpresso IDE下SDK工程导入与 ...
- 痞子衡嵌入式:MCUXpresso IDE下添加C++源文件进SDK工程编译的方法
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE下添加C++源文件进SDK工程编译的方法. 最近有客户反映在MCUXpresso IDE下的SDK工程里添加 ...
- 痞子衡嵌入式:MCUXpresso IDE下使用J-Link下载算法在Flash调试注意事项(i.MXRT500为例)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE下使用J-Link下载算法在Flash调试注意事项. 痞子衡前段时间写过一篇小文<为i.MXRT设计更 ...
- 痞子衡嵌入式:MCUXpresso IDE下SDK工程导入与workspace管理机制
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE下SDK工程导入与workspace管理机制. MCUXpresso IDE是恩智浦软件团队倾注很大心血研发 ...
- 痞子衡嵌入式:MCUXpresso IDE下SDK工程在Build配置上与IAR,MDK差异
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE下SDK工程在Build配置上与IAR,MDK差异. 恩智浦 SW 团队每个季度都会公布 SDK.Tool ...
- 痞子衡嵌入式:MCUXpresso IDE下工程链接文件配置管理与自动生成机制
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE下工程链接文件配置管理与自动生成机制. 痞子衡在 2018 年初写过一个专题 <嵌入式开发文件系列&g ...
- 痞子衡嵌入式:MCUXpresso IDE下将应用程序RW段分散链接的几种方法
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE下将应用程序RW段分散链接的几种方法. 早期的 MCU 芯片,一般都会嵌入内部 Flash 和 RAM,并且 ...
- 痞子衡嵌入式:MCUXpresso IDE下将关键函数重定向到RAM中执行的几种方法
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是MCUXpresso IDE下将关键函数重定向到RAM中执行的几种方法. 前段时间痞子衡写了一篇 <在IAR开发环境下将关键函数重 ...
- 痞子衡嵌入式:MCUXpresso IDE下将源码制作成Lib库方法及其与IAR,MDK差异
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是MCUXpresso IDE下将源码制作成Lib库方法及其与IAR,MDK差异. 程序函数库是一个包含已经编译好代码和数据的函数集合,这 ...
随机推荐
- 深入理解 Nuxt.js 中的 app:created 钩子
title: 深入理解 Nuxt 中的 app created 钩子 date: 2024/9/26 updated: 2024/9/26 author: cmdragon excerpt: 摘要:本 ...
- Nuxt.js 应用中的 link:prefetch 钩子详解
title: Nuxt.js 应用中的 link:prefetch 钩子详解 date: 2024/10/7 updated: 2024/10/7 author: cmdragon excerpt: ...
- GLSL利用SDF进行矩形绘制公式推导
简单记录一下关于SDF绘制矩形的公式推导,因为我们在iq的SDF代码中,给的直接是最后的推导结果,对它是怎么得来的,还是有点困惑. //这是利用sdf绘制矩形 float sdBox( in vec2 ...
- 利用cv2.morphologyEx提取图像边界
cv2.morphologyEx(image, cv2.MORPH_GRADIENT, SE)可以参考这篇博客cv2.MORPH_GRADIENT:形态学梯度(morph-grad),可以突出团块(b ...
- 墨天轮最受DBA欢迎的数据库技术文档-容灾备份篇
在大家的支持与认可下,墨天轮编辑部继续为大家整理出了[墨天轮最受欢迎的技术文档]系列第二篇--容灾备份篇,希望能够帮助到大家. 作为一名数据库管理员,最怕数据库中心突然失去服务能力.影响业务,而不论是 ...
- threejs 父元素 相对位置 position 网格对象
设置position都是相对于父元素的位置设置的 // 导入 threejs import * as THREE from "three"; import { OrbitContr ...
- .Net 使用JWT验证接口
// jwt 的生成和接口的验证 // 需要使用的包 // 1. System.IdentityModel.Tokens.Jwt 生成 Token的 // 2. Microsoft.AspNetCor ...
- 神经网络之卷积篇:详解经典网络(Classic networks)
详解经典网络 首先看看LeNet-5的网络结构,假设有一张32×32×1的图片,LeNet-5可以识别图中的手写数字,比如像这样手写数字7.LeNet-5是针对灰度图片训练的,所以图片的大小只有32× ...
- CKS 认证备考指南
作者:scwang18,主要负责技术架构,在容器云方向颇有研究. 前言 CKA 和 CKS 是 Linux 基金会联合 CNCF 社区组织的云原生技术领域权威的技术水平认证考试,考试采用实操方式进行. ...
- Vue生态工具组合
文章目录 1.Vue版本 2.构建工具 3.包管理器 4.状态管理 5.http库 6.UI库 7.站点生成器 8.优质内容收录 vue生态工具多种多样,我们要如何选择并组合起来才最好呢.接下来给大家 ...