首页 > 其他分享 >#define,const,constexpr的区别与应用

#define,const,constexpr的区别与应用

时间:2024-08-22 22:24:55浏览次数:15  
标签:const 常量 编译 int constexpr define

目录

1. #define

2. const int

3. 常量表达式

4. constexpr

总结

1. #define

  • 作用#define 是一个预处理指令,用于在编译前进行文本替换。

  • 语法#define NAME VALUE

  • 特点

    • 无类型#define 只是简单的文本替换,没有类型信息。
    • 作用域#define 定义的常量在整个文件中有效,直到被 #undef 或文件结束。
    • 调试难度:由于没有类型检查,#define 可能导致错误,调试起来比较困难。
    #define PI 3.14159
    

2. const int

  • 作用const int 用于定义一个在运行时不能改变的常量。

  • 语法const int NAME = VALUE;

  • 特点

    • 有类型const 常量具有明确的类型,并且进行类型检查。
    • 作用域const 常量遵循 C++ 的作用域规则,可以在局部或全局范围内定义。
    • 编译时常量const int 常量的值可以在编译时确定,但不能用于编译时计算的复杂场景。
    const int MAX_SIZE = 100;
    

3. constexpr

  • 作用constexpr 用于定义在编译时可以求值的常量和函数。

  • 语法constexpr TYPE NAME = VALUE; 或 constexpr RETURN_TYPE FUNCTION_NAME(ARGUMENTS) { ... }

  • 特点

    • 编译时计算constexpr 变量和函数可以在编译时进行计算,以优化程序性能。
    • 类型安全constexpr 具有类型检查,能够更安全地定义常量。
    • 函数constexpr 函数可以在编译时计算结果,C++14 及更高版本允许函数体包含更复杂的逻辑(如条件语句、循环等)。
    constexpr int square(int x) {
        return x * x;
    }
    
    constexpr int SIZE = 10;
    int arr[SIZE];
    

总结

  • #define:简单的文本替换,无类型检查和作用域控制。
  • const int:有类型的常量,适合用于需要类型安全的场景。
  • constexpr:提供了强大的编译时计算能力和类型安全,适合用于复杂的编译时常量计算。

标签:const,常量,编译,int,constexpr,define
From: https://blog.csdn.net/song0789/article/details/141439430

相关文章

  • C++ const的用法详解
    前言const在C/C++中是十分重要的,如果单纯理解为"常量"那么你的格局就小了,今天在这里给大家介绍一下const在C++中具体详细的用法。一const的基本概念const名叫常量限定符,用来限定特定变量,以通知编译器该变量是不可修改的。习惯性的使用const,可以避免在函数中对某些不应修改的......
  • 【C++】定义类型别名的三种方式及其优缺点:typedef,#define 和 using
    引言类型别名是一种给已存在的类型创建一个新名字的方式。这个新的名字(别名)和原类型在语义上是完全相等的,可以在任何原类型可以使用的地方使用。类型别名并不创建一个新的类型,只是为了提高代码的可读性和可维护性。在C++中,可以使用typedef,#define或者using来定义别名。每......
  • MapStruct+Maven+Lombok问题NoSuchBeanDefinitionException、does not have an access
    概述先直接说我遇到的问题吧,SpringBoot应用启动失败:ERROR|org.springframework.boot.web.embedded.tomcat.TomcatStarter|onStartup|61|-ErrorstartingTomcatcontext.Exception:org.springframework.beans.factory.UnsatisfiedDependencyException.Message:Er......
  • (2-2-2)LiDAR激光雷达传感器感知:点云处理(2)法向量估计(Normal Estimation)+曲面重建(Surface
    2.2.4 法向量估计(NormalEstimation)算法法向量估计的目的是计算每个点的法向量,用于后续任务如曲面重建和特征提取。常用的法向量估计(NormalEstimation)算法如下所示。1.最小二乘法(LeastSquares)算法最小二乘法(LeastSquares)算法通过最小化点云到法向量的误差来估计法向......
  • [Paper Reading] Reconstructing Hands in 3D with Transformers
    名称ReconstructingHandsin3DwithTransformers时间:CVPR2024机构:UCBerkeley,UniversityofMichigan,NewYorkUniversityTL;DR本文提出一种使用Transformer来做HandTracking的算法名为HaMeR(HandMeshRecorvery),优势是大数据规模(利用多数据集的2D/3D标签),大模型(......
  • 023、Vue3+TypeScript基础,使用defineProps限制父传子的数据类型,并用v-for显示
    01、index.js代码如下://定义一个接口,用于限制person对象的具体属性exportinterfacePersonInter{id:string;name:string;age:number;}exporttypePersons=Array<PersonInter>;02、App.vue代码如下:<template><divclass="app">&......
  • 012、Vue3+TypeScript基础,子页面使用defineExpose暴露成员来给主页面使用
    01、App.vue代码如下:<template><divclass="app"><h2>{{title}}</h2><button@click="showLog">点我数组子页面年龄</button><!--使用了ref来获取子组件的属性--><Personref="person001"/......
  • CSS的:defined伪类:选择已定义元素的新选择器
    CSS(层叠样式表)是控制网页样式的核心语言,随着CSS4的提出,一系列新的选择器被引入,其中:defined伪类便是这些新特性之一。:defined伪类允许开发者选择HTML文档中已经定义的元素,这在处理自定义元素(如WebComponents)时非常有用。本文将详细介绍:defined伪类的使用方式、应用场景以......
  • 了解一下宏定义#define吧c++
    在C++中,宏定义是通过 #define 指令实现的,它用于创建符号常量或宏函数。这是一种预处理指令,意味着它在编译之前被处理。下面是宏定义的用法、理解和重点。宏的基本语法定义常量:#definePI3.14159这里,PI 是一个常量,它的值是 3.14159。在代码中每次使用 PI 时,编译器......
  • Visual Studio 第一行,scanf报错解决。#define _CRT_SECURE_NO_WARNINGS 1
    【问题描述】想必大家刚装好VisualStudio,准备自信满满去开始编写自己的第一个程序时,却出现这个错误: 'scanf':Thisfunctionorvariablemaybeunsafe.Considerusingscanf_sinstead.Todisabledeprecation,use_CRT_SECURE_NO_WARNINGS.Seeonlinehelpfordet......