C++中#define和const的区别

2023-05-16

一、#define是预处理指令(pre-processor directive)而const是关键字

#define用于给一些值定义名称(字符串),这样定义的字符串在C、C++中称为宏定义,而const是一个关键字(keyword)或用于使标识符(identifier)的值为常量

众所周知, 从 C++ 源代码可执行文件要经历4个过程

  1. 预处理:对源代码文件中的文件包含关系(头文件)预编译语句(宏定义)进行分析和替换。
  2. 编译
  3. 汇编
  4. 链接

#define是在第一步 “预处理”的时候执行的。const不是。

二、#define无作用域限制而const有

Macro)可以被定义在当前程序的任意位置或者被当前程序包含(include)的头文件中,因此宏无作用域限制。但是 常量(constant)被定义在函数中,因此常量只能在它被定义的函数的作用域中才能被访问
使用 const总是一个好习惯。因为使用 const 我们可以控制它的作用域。如果它被放在任意用户自定义函数中,那么它只能在该函数中起作用。

#include <iostream>
using namespace std;

//macro definition
#define X 30

//global integer constantt
const int Y = 10;

int main()
{
	//local ineteger constant`
	const  int Z = 30;
	
	cout<<"Value of X:  "<<X<<endl;
	cout<<"Value of Y:  "<<Y<<endl;
	cout<<"Value of Z:  "<<Z<<endl;  

	return 0;
}

输出

Value of X: 30 
Value of Y: 10 
Value of Z: 30

在上面的程序中,X全局符号常量(global symbolic constant),在编译前经过预处理Y 也是全局常量,而 Zmain函数 的局部常量

三、宏(#define)可以重定义但是const不能

宏(已定义,defined)可以在程序中的任何位置重新定义(通过先取消定义然后定义,un-defining and then defineing)。但是常量不能被 重定义,我们甚至不能对常量再次赋值(re-assign)。

#include <iostream>
using namespace std;

//macro definition
#define X 30

int main()
{
	cout<<"Value of X: "<<X<<endl;
	#undef X
	#define X 300
	cout<<"Value of X: "<<X<<endl;

	return 0;
}

输出:

Value of X: 30
Value of X: 300

我们成功改变了 X 的值。

#include <iostream>
using namespace std;

//constant int 
const int Y=10;

int main()
{
	cout<<"Value of Y: "<<Y<<endl;
	Y=100;	//error, we can not assign value to const
	cout<<"Value of Y: "<<Y<<endl;

	return 0;
}

输出:

main.cpp: In function 'int main()': 
main.cpp:10:3: error: assignment of read-only variable 'Y'  
  Y=100; //error, we can not assign value to const  
   ^

我们可以看到,在我们尝试改变 Y (一个常量)的值的时候,报了一个编译错误(compilation error)。

注:全文翻译自Difference between const and #define in C, C++ programming language,局部有增删改动。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++中#define和const的区别 的相关文章

  • es6的总结下var、let 和 const 的区别

    var 和 let 的区别是老生常谈 xff0c 看到网上一些文章的总结 xff0c 有的不太全面 xff0c 甚至有的描述不太准确 xff0c 在这里尽量全面的总结下这三者的区别 let 是 ES6新增的变量类型 xff0c 用来代替 v
  • CUJ:标准库:定义iterator和const iterator

    The Standard Librarian Defining Iterators and Const Iterators Matt Austern http www cuj com experts 1901 austern htm top
  • c# 常量(const) 使用的注意事项

    在我们编码的过程 xff0c const 是我们经常用到的一种声明类型 xff0c 如果不了解const的运行机制 xff0c 有时候会发生一些莫名其妙的bug 可能让我们掉入深坑中 接下来我们一起看看常量的应用吧 xff01 1 常量默认
  • 对‘cv::Mat::Mat()’未定义的引用,对‘cv::Mat::clone() const’未定义的引用

    报错如下 xff1a 解决办法 xff1a 在自己的可执行文件链接库的时候在后面加入opencv库即可 xff0c 即加入 OpenCV LIBS xff0c 如下图 xff1a add library sensor setup nodel
  • void fun() const{}; const void fun(){}; 和void const fun(){}; 的区别?

    const void fun 和void const fun 两个相同 如果采用 34 按址传递方式 34 的函数返回值加const 修饰 xff0c 那么函数返回值 xff08 即地址 xff09 的内容不能被修改 xff0c 该返回值只
  • var let const 详细区别

    用了ES6已经有一段事件了 xff0c 也看了很多文档 xff0c 以前觉得不用写一个文档总结 xff0c 但是经过一段时间的接触以后 xff0c 认为自己还是有必要去吧他们的区别详详细细的总结一下 块级作用域 白话一点就是在 中就是一个块
  • C#中的readonly与const区别

    xfeff xfeff const 的概念就是一个包含不能修改的值的变量 常数表达式是在编译时可被完全计算的表达式 因此不能从一个变量中提取的值来初始化常量 如果 const int a 61 b 43 1 b是一个变量 xff0c 显然不
  • c语言 gpio指针定义,#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)这句话的具体作用是什么啊...

    一 GPIO Init函数解析 1 1 参数GPIO TypeDef 1 2 参数GPIO InitStruct 2 3 函数代码详解 4 4 备注 6 一 GPIO Init函数解析 首先来看一下GPIO Init函数的原型void GP
  • C语言中的关键字应用技巧(volatile、const、struct/union、_ _预定义_ _、#/##、void/void*、weak)

    嵌入式C开发关键字的应用技巧 1 volatile volatile修饰表示变量是易变的 xff0c 编译器中的优化器在用到这个变量时必须每次都小心地从内存中重新读取这个变量的值 xff0c 而不是使用保存在寄存器里的备份 xff0c 有效
  • #define、typedef 和 using之间的联系和区别

    目录 一 define 1 含义 2 用处 1 条件编译 2 解宏 3 文件包含 二 typedef 1 含义 2 用处 1 数据类型别名 2 指针别名 3 结构体别名 4 与平台无关的数据类型 三 using 1 含义 2 用处 1 权限
  • 对‘cv Mat Mat()’未定义的引用‘cv imread(cv String const&, int)’未定义的引用 ...的解决办法

    对 cv Mat Mat 未定义的引用 cv imread cv String const amp int 未定义的引用 的解决办法 视觉SLAM十四讲的ch5的部分代码 xff0c 运行时出现了大面积的报错 xff0c 说相应的函数没有定
  • C语言带参#define个人理解

    之前接触带参 define比较少 xff0c 这几天 查阅stm32官方固件库 xff0c 看到以下代码有点懵 xff1a define IS GPIO ALL PERIPH PERIPH PERIPH 61 61 GPIOA PERIPH
  • const pointer

    int a b const int p 61 a 与int const p 61 a 是一样的 表示p可以指向a xff0c 也可以改变指向b xff0c 但是不能通过指针p来修改a的值 p 61 b p 61 4 int const q
  • C 语言中 const 与指针的结合使用

    请区分一下几种指针的区别 1 const int p 2 int const p 3 int const p 4 const int const p 5 const int const p 解析 xff1a 1 const int p 中
  • C语言学习笔记->const和define区别

    1 define 是预编译指令 xff0c 而const 是普通变量的定义 define定义的宏是在预处理阶段展开的 xff0c 而const定义的只读变量在编译运行中使用 2 const定义的是变量 xff0c 而define定义的是常量
  • C-const与指针

    const int p 不可以对 p 再次进行赋值 但可以对p进行再次赋值 p 6 p int const p 不可以对p再次进行操作 但可以对 p 再次进行操作 p 6 p const int const p 既不可以对p再次进行操作 也
  • #define宏定义详解

    define宏定义 1 常规用法 无参宏 define PI 3 1415926 define EN 1e5 定义指数1 10e5 cout lt
  • var与ES6中const、let声明的变量的区别

    好久以前的研究 今天再来回顾一下 首先我们比较一下使用var声明的变量和不使用var声明的变量的区别 使用var声明的变量声明前调用 那么该变量的值为undefined 不使用var声明的变量声明前调用直接报错Uncaught Refere
  • C++的const关键字

    文章目录 一 C 的const关键字 二 const在类中的含义 一 C 的const关键字 这里可以分为两种情况 一种是类似与C语言里面的 const char char const 一种是C 用于类里面限定函数的 const int c
  • 指针与const限定符

    const限定符和指针结合起来常见的情况有以下几种 const int a int const a 这两种写法是一样的 a是一个指向const int的指针 a所指向的内存单元不可改写 所以 a 是不允许的 但a可以改写 所以a 是允许的

随机推荐

  • curl命令常用参数

    curl命令常用参数 curl简介常用方法将远程文件下载到本地 o并指定名称指定请求方式 X显示响应结果 v携带用户名 密码 u携带请求头 H查看服务端响应头 i只显示http response的头信息 I自动跳转 L模拟dns解析 res
  • 学习ZLmediaKit流媒体服务器时候遇到的问题

    照zlmediakit的源码 自己复制了一份 然后有的地方编译不过修改了部分 测试的时候发现有两个问题 第一是 ffmpeg的ffplay 能播放 vlc不能播放 第二个问题是directProxy设置为0的时候 推流的时候 然后用ffpl
  • 如何在C/C++中使用pi (π) 值

    在math h有一个宏定义M PI if defined USE MATH DEFINES amp amp defined MATH DEFINES DEFINED define MATH DEFINES DEFINED Definitio
  • 关于#include<bits/stdc++.h>

    偶然发现 span class hljs preprocessor include lt bits stdc 43 43 h gt span 包括了C 43 43 几乎所有的头文件 xff0c 感觉以后可以返璞归真了 回顾自己不长的竞赛历程
  • 单片机STM32直连电调控制航模涵道电机的方法总结

    单片机STM32直连电调控制航模涵道电机的方法总结 文章目录 单片机STM32直连电调控制航模涵道电机的方法总结前言一 硬件情况二 涵道电机两种常见的驱动方式1 有线控制方式2 无线控制方案 解决方案 前言 由于项目需要 xff0c 我需要
  • PX4之常用函数解读

    PX4Firmware 经常有人将Pixhawk PX4 APM还有ArduPilot弄混 这里首先还是简要说明一下 xff1a Pixhawk是飞控硬件平台 xff0c PX4和ArduPilot都是开源的可以烧写到Pixhawk飞控中的
  • PX4项目学习::(七)飞控栈:commander

    PX4的飞行控制程序通过模块来实现 xff0c 与飞控相关的模块主要有commander xff0c navigator xff0c pos control xff0c att control这几个 xff0c 分别可以在src modul
  • PX4项目学习::(五)模块代码启动流程

    54条消息 PX4 模块代码启动流程 zhao23333的博客 CSDN博客
  • TX2指南(一)TX2接显示器的问题

    TX2开发板一定要适配HDMI显示器 xff0c 使用转接头在VGA显示器会显示 input signal out of range xff01 所以目前来看手上的这套TX2只能适配HDMI显示器 xff0c 目前还不清楚是不是所有的TX2
  • 推荐定位信息(GPRMC)

    推荐定位信息 GPRMC GPRMC lt 1 gt lt 2 gt lt 3 gt lt 4 gt lt 5 gt lt 6 gt lt 7 gt lt 8 gt lt 9 gt lt 10 gt lt 11 gt lt 12 gt hh
  • linux中使用shell命令打开指定文件夹(Nautilus@GNOME)

    在GNOME中是Nautilus 鹦鹉螺 xff0c 而KDE中是Konqueror nautilus 图形化桌面包括了一个叫做 Nautilus 的文件管理器 它给你提供了系统和个人文件的图形化显示 然而 xff0c Nautilus 不
  • 在ubuntu20.4下安装ardupilot 4.3.6

    这次重新安装真的是遇到了好多坑啊 xff01 从github上靠过来按照之前的那篇文章流程做完之后 xff0c 还会有一些别的问题 首先是module里面的包都没有拷过来 xff0c 所以需要用git add将文件都添加过来 之后进行编译时
  • Visual Studio 2022 搭建GLFW OpenGL开发环境

    最近工作需要 需要写一个全景的视频播放器 网上搜了下大概解决方案是 ffmpeg 43 opengl b站有很多视频 按照视频 搭建了OpenGL的开发环境 先去GLFW的网站下载 windows平台的库文件 为什么使用GLFW 因为GLF
  • Pixhawk原生固件PX4之自定义MAVLink消息

    欢迎交流 个人 Gitter 交流平台 xff0c 点击直达 xff1a 本着想在PX4基础上加点什么东西的我又开始折腾了 xff0c 先尝试用串口加传感器通过QGC查看 xff0c 要是能在原固件上加点内容就棒哉了 先立Flag 自定义u
  • Pixhawk原生固件PX4之MAVLink协议解析

    欢迎交流 个人 Gitter 交流平台 xff0c 点击直达 xff1a PX4 对Mavlink 协议提供了良好的原生支持 该协议既可以用于地面站 Ground ControlStation GCS 对无人机 UAV 的控制 xff0c
  • GPS和RTK的基本知识

    RTK的基本原理介绍 xff0c RTK一般由基站 移动站以及数据链路组成 下文摘自天宝 Trimble 官网 原文链接 xff1a http www trimble com OEM ReceiverHelp V4 44 en What i
  • freeRTOS系统栈与任务栈

    中断过来之后 xff0c 由任务栈切换到main stack xff08 系统栈 xff09 任务栈保存 系统栈的地址范围为0xfede8000 4K xff0c 向下生长 xff0c 所以按照ld的定义 xff0c 0xfede9000
  • ROS下上位机和stm32单片机通信

    1 需要实例化串口节点建立监听者listener和发布之publisher 2 上位机通过游戏手柄发布自定义消息类型control int64 mode 手柄模式切换 int64 lidar 雷达数据 int64 gamePad x 控制前
  • 奇偶校验码

    偶校验为例 xff1a 例图中 xff0c 下划线为校验位 xff0c 其余为信息位 检错步骤如下 xff1a 1 根据信息位算出校验位 xff08 通过异或运算 xff1a 相同为0 xff0c 不同为1 xff09 xff1a 得出校验
  • C++中#define和const的区别

    一 define是预处理指令 xff08 pre processor directive xff09 而const是关键字 define用于给一些值定义名称 字符串 xff0c 这样定义的字符串在C C 43 43 中称为宏定义 xff0c