条款1:尽量用const和inline而不用#define

LVGL与STM32的理解(基于正点原子资料) 我们要在lcd_draw_fast_rgb_color里面实现对屏的具体操作(也就是在这里实现自己的代码)。lcd_set_window、lcd_write_ram_prepare、lcd_wr_data这三个函数是本例程LCD屏的控制函数(也就是自己写的函数)。以下是stm32工程的文件目录,GUI_APP也可以忽略(细节参考正点原子例程):这里主要是再次加强一下印象,主要就是把。,里面的lcd_init()与lcd_display_dir是。它们都是LVGL的接口,按照它们的需求,把内容给它们即可。 阅读详情

一 Shifting from c to c++

条款1:尽量用const和inline而不用#define

也称为:尽量用编译器而不用预处理。

原因:

(1)#define ASPECT_RATIO 1.653 编译前预处理程序会将ASPECT_RATIO 替换为1.653,编译出错时只会指出1.653,而无法跟踪ASPECT_RATIO,不便于调试

(2)#define max(a,b) ((a) > (b) ? (a) : (b))

有可能出错:

int a = 5, b = 0;

max(++a, b);// a 的值增加了2次

max(++a, b+10); // a 的值只增加了1次

解决方法:

(1)      用const 而不用#define:

const double ASPECT_RATIO = 1.653;

(2)用inline而不用#define:

inline int max(int a, int b) { return a > b ? a : b; }

内联函数既有宏的效率,又有可预计的行为和类型安全保证。

为了可以使用多种类型可以用模板:、

template<class T>

inline const T& max(const T& a, const T& b)

{ return a > b ? a : b; }

-----------------------------------------------------补充说明:--------------------------------------------------------

类中常量的使用:

(1)要把常量限制在类中,首先要使它成为类的成员;为了保证常量最多只有一份拷贝,还要把它定义为静态成员:

class GamePlayer {

private:

    static const int NUM_TURNS = 5; // constant eclaration

    int scores[NUM_TURNS];      // use of constant

    ...

};

上面的语句是NUM_TURNS的声明,而不是定义,所以还必须在类的实现代码文件中定义类的静态成员:

const int GamePlayer::NUM_TURNS;    // mandatory definition;

        // goes in class impl.file

(2)旧一点的编译器会不接受这种语法,因为它认为类的静态成员在声明时定义初始值是非法的;而且,类内只允许初始化整数类型(如:int, bool, char 等),还只能是常量。
在上面的语法不能使用的情况下,可以在定义时赋初值:

class EngineeringConstants { // this goes in the class

private:        // header file

    static const double FUDGE_FACTOR;

    ...

};

    // this goes in the class implementation file

    const double EngineeringConstants::FUDGE_FACTOR = 1.35;

(3)但是当类在编译时需要用到这个类的常量,例如上面GamePlayer::scores数组的声明(编译过程中编译器一定要知道数组的大小),为了弥补那些(不正确地)禁止类内进行整型类常量初始化的编译器的不足,可以采用称之为“借用enum”的方法来解决。这种技术很好地利用了当需要int类型时可以使用枚举类型的原则,所以GamePlayer也可以象这样来定义:

class GamePlayer {

private:

    enum { NUM_TURNS = 5 }  // "the enum hack" — makes

    // NUM_TURNS a symbolic name

    // for 5

    int scores[NUM_TURNS];// fine

};

除非你正在用老的编译器(即写于1995年之前),你不必借用enum。

综合上面的情况,为了能够兼容老的编译器,同时为了能在类中确定数组的大小,可依以下顺序使用常量:

首先考虑用enum;

在定义类时声明静态常量,在实现类时初始化此常量;

如果编译器允许,可以在定义类时初始化静态常量。

-------------------------------------------------------end-------------------------------------------------------------

YOLO11实战 第056期-基于yolo11的无人机航拍铁路障碍物检测实战-数据集&源码&系统 召回率曲线帮助评估模型在目标检测任务中,检测到真正目标的能力。通过这条曲线,可以评估模型在目标检测任务中的整体性能,并找到合适的置信度阈值,以在精确率和召回率之间做出最佳平衡。PR曲线越接近右上角,模型性能越好,曲线下方的面积越大,说明模型在不同置信度下的。这条曲线显示了随着置信度的增加,每个类别的召回率先变化较小,然后在某个点之后迅速下降。通过这条曲线,可以选择合适的置信度阈值,以优化模型的检测结果,平衡精确率和召回率。曲线都显示了随着召回率的增加,精确度略有下降的趋势,但整体上精确度保持在很高的水平。 阅读详情

相关推荐

半导体AMHS系统振动控制技术演进:从0.5G到超低振动的工艺革命

在半导体制造进入埃米级时代后,AMHS的振动控制能力将成为区分厂商技术等级的标尺。国内企业通过“弹性机械设计-混合主动控制-智能调度”的三重创新,正逐步突破0.2G阈值,支撑12英寸晶圆厂向3nm/2nm制程升级。未来,振动抑制不再仅是物流系统的性能参数,而是与光刻、刻蚀等核心工艺深度耦合的基础能力,这将重塑半导体设备产业的竞争格局。

m0_60674045的博客 1583

《C++ Templates》笔记——1.函数模板

1.初探函数模板 函数模板是被参数化的函数,代表的是一个函数家族。它们看起来与普通函数很相似,唯一的区别是有些函数元素是未确定的,这些函数将在使用时被参数化。模板主要有函数模板和类模板。 1.1定义模板 下面定义了一个返回两个值中最大值的函数模板: template&amp;amp;amp;amp;amp;lt;typename T&amp;amp;amp;amp;amp;gt; inline T const&amp;amp;amp;amp;amp;amp; max(T c

独学而无友,则孤陋而寡闻 977

lenovo联想拯救者Legion Y9000P 2022款2023款2024款笔记本电脑(82RF,82WK,82WQ,83DE,83DF)原装出厂Windows11预装OEM系统镜像下载

联想原装出厂系统自带所有驱动、出厂主题壁纸、系统属性联机支持标志、系统属性专属LOGO标志、Office办公软件、联想电脑管家、联想浏览器、联想软件商店、legionzone控制中心等预装程序。链接:https://pan.baidu.com/s/1YBji_oh7xOkq-NxnS8Mm8g?链接:https://pan.baidu.com/s/1S7_enXmuoja1a9ASvUT5Fg?拯救者Legion Y9000P IRX9H 2024款【83DE】原厂Win11系统包。

QQ17855069的博客 6507

理解c++ template 函数

这个函数可是很有意思啊 全部的应该是template< class T > inline T const & max( T const & a, T const & b )吧! 首先这是一个函数模板,作用是比较 T类型的两个变量 a b,的大小! inline 表示这是一个内联函数作用你就自己查吧!这个挺重要的哦! 我重点说后面的const 先要知道被const...

fsspringalex的博客 351

金蝶云星空核心数据表解析与高效关联查询指南

本文深入解析金蝶云星空核心数据表结构,提供高效关联查询的实战指南。文章详细介绍了基础资料、业务单据和财务模块的关键表及其关联逻辑,重点阐述了如何利用关联表(_LK表)进行跨单据溯源,并分享了编写高性能SQL的实用技巧与避坑建议,帮助开发者、实施顾问和数据分析师快速掌握数据查询方法,提升工作效率。

weixin_29254673的博客 524

视频生成工具本地部署完全指南:Seedance能装吗?有哪些开源替代?

本文系统介绍了视频生成模型的本地部署方案,分为三个部分:1)Seedance 2.0的混合部署模式,其开源组件可本地集成但核心功能需调用API;2)完全开源替代方案对比,包括LTX-2、Wan 2.1等模型的硬件需求与特点;3)详细部署指南,以ComfyUI+Wan 2.1为例,涵盖软件准备、模型整合、参数调优等步骤,并提供了显存优化和多GPU配置技巧。文章为需要离线视频生成能力的用户提供了完整技术路径。

小明的博客 1万+

C++函数模板中一点小疑问

C++函数模板

qq_45766916的博客 365

【虚幻引擎UE】UE5 仅需6步轻松实现关卡顺滑切换

【虚幻引擎UE】UE5 仅需6步轻松实现关卡切换

灵境引路人 2万+

c++ templates 函数模板

1、定义函数模板: [cpp] view plain copy templatetypename T>   inline T const& Max(T const& a, T const& b){     return a  }   解释:template表明了这是一个函数模板, 2、调用函数模板 [cpp] view p

Doraemon___的博客 771

CUDA编程 - Nsight system & Nsight compute 的安装和使用 - 学习记录

在 cuda 编程中,经常会用到 Nsight system 和 Nsight compute 进行性能分析等,下面做个学习总结。本篇包括安装和常用分析思路总结,具体实践操作总结会放在下一篇博客。

点云算法工程师 1万+

UG\NX二次开发 获取三平面交点

//如果返回值不为0 则此三个面没交点 int three_faces_point(tag_t tagFace1, tag_t tagFace2, tag_t tagFace3, double *dou_x, double *dou_y, double *dou_z)

王牌飞行员_里海的博客 674

C++学习笔记:函数模板

函数模板C++提供了模板(template)编程的概念。所谓模板,实际上是建立一个通用函数或类,其类内部的类型和函数的形参类型不具体指定,用一个虚拟的类型来代表,是一种对类型进行参数化的工具。这种通用的方式称为模板。模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。C++模板通常有两种形式:函数模板和类模板;这篇文章主要讲函数模板相关知识,函数模板是那些被参数化的函数,它们代表的是一个函数家族。它的表示(即外形)看起来和普通的函数很相似,唯一的区别就是有些函数元素是未确定的,这些元素将

iuices的博客 780

【目标检测】全局上下文感知的详解

目标检测中的全局上下文感知(Global Context Awareness)​是指模型在定位和识别目标时,能够有效利用图像中全局或大范围的上下文信息(如场景语义、目标间关系、空间布局等),而不仅仅依赖局部特征。这种能力显著提升了检测的鲁棒性,尤其是在复杂场景(如遮挡、小目标、密集目标)中表现突出。

浩瀚之水的专栏 644

effective C++ 条款 1:尽量用const和inline而不用#define

effective C++ 条款 1:尽量用const和inline而不用#define 尽量用编译器而不用预处理 #define ASPECT_RATIO 1.653 它会被预处理程序去掉,于是ASPECT_RATIO不会加入到符号列表中 定义指针常量时会有点不同 要

lidanny的专栏 559

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

条款1:尽量用const和inline而不用#define

如果改成“尽量用编译器取代预处理器”会更好些 用const 不用#define的原因 因为#define的名称不会出现在符号表中,所以会给调试带来麻烦,你可能会遇到一个数字却不知道从何而来。 Const有很多其他用法: 定义常量指针: const char * const authorName = “Scotter Mayers”; 定义class专属的常量:  class GameP

夜影轩的专栏 718

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Effective C++:条款1:尽量用const和inline而不用#define

这个条款最好称为:“尽量用编译器而不用预处理”,因为#define经常被认为好象不是语言本身的一部分。这是问题之一。再看下面的语句: #define ASPECT_RATIO 1.653 编译器会永远也看不到ASPECT_RATIO这个符号名,因为在源码进入编译器之前,它会被预处理程序去掉,于是ASPECT_RATIO不会加入到符号列表中。如果涉及到这个常量的代码在编译时报错,就会很令人费解,

IT民工 1718

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

条款1:尽量用const和inline而不用#define [effective C++ 学习笔记]

这一节主要讲得是,为什么const,inline要比#define好,总结起来如下: 1 如果使用#define,编译器只是会傻乎乎的将define后面的内容替换成定义的变量,拿 const double ASPECT_RATIO = 1.653;举例,如果这样定义后,代码中使用 ASPECT_RATIO 时,在编译代码的时候,会将 ASPECT_RATIO 变量统一替换成1.653这个数字

sky200543012的专栏 783

Effective C++学习笔记:条款1:尽量用const和inline而不用#define

尽量不用#define这条语句,这条语句不认为是C++语言的一部分,而且在进行字符替换时会带来很多的问题。原计划用define定义的普通常量 ,可以换成const定义的常量,如:const double ASPECT_RATIO = 1.653;但是想用一个const常量定义原define宏定义的指针常量时,除了指针所指的类型要定义成const外,重要的是指针也经常要定义成const。例如

qinmelody的专栏 599

Effective C++ 条款1: 尽量用const和inline而不用#define (连载)

条款1: 尽量用const和inline而不用#define这个条款最好称为:“尽量用编译器而不用预处理”,因为#define经常被认为好象不是语言本身的一部分。这是问题之一。再看下面的语句:#define ASPECT_RATIO 1.653 编译器会永远也看不到ASPECT_RATIO这个符号名,因为在源码进入编译器之前,它会被预处理程序去掉,于是ASPECT_RATIO不会加入到符号

fxh_nly的专栏 243
上一篇: LDAP与数据库
下一篇: 条款2:尽量用iostream而不用stdio.h
生无涯
博客等级 码龄16年 62粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值