首页 > 编程语言 >痞子衡嵌入式:MCUXpresso IDE下C++源文件中嵌套定义的复合数据类型命名空间认定

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

时间:2024-12-18 14:20:46浏览次数:9  
标签:frg clock clk 数据类型 C++ 源文件 config kCLOCK


  大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是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主页知乎主页微信公众号 平台上。

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

标签:frg,clock,clk,数据类型,C++,源文件,config,kCLOCK
From: https://www.cnblogs.com/henjay724/p/18614816

相关文章

  • C++9--前置++和后置++重载,const,日期类的实现(对前几篇知识点的应用)
    目录1.前置++和后置++重载2.const成员3.日期类的实现1.前置++和后置++重载#include<iostream>usingnamespacestd;classDate{public: Date(intyear=2024,intmonth=1,intday=1) { _year=year; _month=month; _day=day; } //前置++:返......
  • 12C++循环结构-for循环(2)
    一、循环变量为字符型试编一程序,按字典顺序输出26个字母。流程图:程序代码如下:#include<iostream>//包含输入输出流头文件iostreamusingnamespacestd;//指明程序使用命名空间std(标准)intmain(){chari;for(i='a';i<='z';i++)//循环变量可以是整数,也......
  • 第一章 从C到C++(二)
    知识图谱Array类模版1.基本语法 #include<array>std::array<T,N>array_name;T 是数组中元素的类型。N 是数组的大小,必须是一个非负整数。2.声明与初始化<array> 需要在编译时确定大小,不能动态改变。使用示例:在声明中用初始化列表初始化array对象#include......
  • C++中出了作用域如何释放内存
    在C++中,是否会在作用域结束后自动释放内存,取决于内存的分配方式:1.栈内存分配如果变量是在 栈(stack)上分配的,那么当变量超出其作用域时,内存会自动释放。示例:栈上分配#include<iostream>usingnamespacestd;voidfunc(){inta=42;//栈上分配cout<<a<......
  • Memory Leak Detector:C++内存泄漏常见原因分析_2024-07-23_09-29-09.Tex
    MemoryLeakDetector:C++内存泄漏常见原因分析C++内存管理基础动态内存分配与释放在C++中,动态内存管理是通过new和delete操作符来实现的。new操作符用于在运行时分配内存,而delete操作符用于释放之前分配的内存。理解动态内存分配与释放的机制对于避免内存泄漏至关重要。......
  • C/C++语言基础--C++STL库=之仿函数、函数对象、bind、function简介
    本专栏目的更新C/C++的基础语法,包括C++的一些新特性前言STL无疑是C++史上一个重要的发明,未来我将更新STL有关的知识点,入门绝对够了(看目录就知道了......
  • 【数据】collections --- 容器数据类型
    【万字长文详解】Python库collections,让你击败99%的Pythoner-知乎(zhihu.com)Counter在Python中,Counter是一个非常实用的工具,它位于collections模块中。Counter是一个字典子类,用于追踪可哈希对象。它以元素作为键,以元素出现的次数作为值。以下详细阐述Counter在Python中的使......
  • c++实验六
    task4:Vector.hpp:1#pragmaonce2#include<iostream>3#include<stdexcept>4usingnamespacestd;56template<typenameT>7classVector8{9private:10intsize;11T*ptr;12public:13Vector(......
  • c++:STL:string
    1.STL简介1.1什么是STLSTL(standardtemplatelibaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。1.2STL的六大组件STL有六大组件,其中现在最重要的是容器和算法两类,容器其实就是数据结构2.......
  • C++从零到进阶 ④.1数组(介绍)
    本次是【C++从零到进阶】的第④课(介绍):数组介绍我们一个个来介绍提示:介绍单吃很难吃透,需要结合后续练习跟进才能做到掌握哦!新手食用:看目录更好找重点,!为重要或较详细内容一、数组的概念、定义与引用数组名的命名规则与变量名的命名规则一致;整型表达式表示数组元素的个数......