#define宏定义详解

2023-10-31

#define宏定义

1.常规用法无参宏

#define PI 3.1415926

#define EN 1e5//定义指数1*10e5;

cout<<PI<<endl;//默认位有效数字3.14159

2.使用参数

(1)不使用括号

#define SQUARE(x) x*x

cout<<SQUARE(2)<<endl;//4

cout<<SQUARE(2+3)<<endl;//2+3*2+3=11

int x=6;

cout<<SQUARE(x+1)<<endl;//6+1*6+1=13

cout<<SQUARE(++x)<<endl;//7*8=56

(2)使用括号 很重要

#defineSQUARE(x) ((x)*(x))

cout<<SQUARE(2)<<endl;//4

cout<<SQUARE(2+3)<<endl;//(2+3)*(2+3)=25

int x=6;

cout<<SQUARE(x+1)<<endl;//49

cout<<SQUARE(++x)<<endl;//7*8=56

解决办法最简单的是:不要在有参宏用使用到++“–”,否则后一个的值会在前一个基础上+1或取负值。

(3)定义比较大的数据,如一年有多少秒?

#include <stdio.h>

#define SECONDS_PER_YEAR  60*60*24*365UL

int main(void)

{

    unsigned long int  a = SECONDS_PER_YEAR;

    cout<<a<<endl;

    return 0;

}

3.防止头文件被重复包含

#ifndef cTest_Header_h

#define cTest_Header_h

//头文件内容

#endif

4. #define #typedef 的区别

1)修饰指针操作时,作用不同

#define INT1 int *

typedef int * INT2;

 

int main()

{

    int m=1,n=2;

    INT1 a1, b1;

    INT2 a2, b2;

    b1 =&m;//no  

    b2 =&n;//ok

    return 0;

}

因为 INT1 a1, b1; 被宏代换后为: int * a1, b1;即定义的是一个指向int型变量的指针 a1 和一个int型的变量b1.而INT2 a2, b2;表示定义的是两个变量a2和b2,这两个变量的类型都是INT2的,也就是int *的,所以两个都是指向int型变量的指针。

所以两者区别在于,宏定义只是简单的字符串代换,不做正确性检查,在预处理阶段完成。而typedef不是简单的字符串代换,而是在自己的作用域内给一个已经存在的类型一个别名,类型的别名可以具有类型定义说明的功能,在编译阶段完成的。

 

2)作用域不同

#define没有作用域的限制,只要是之前预定义过的宏,在以后的程序中都可以使用。typedef有自己的作用域。

【例2.3.1没有作用域的限制,只要是之前预定义过就可以

void func1()  

  {  

       #define HW "HelloWorld";  

  }  

     

   void func2()  

   {  

       string str = HW;  

       cout << str << endl;  

 }  

【例2.3.2typedef有自己的作用域

   void func1()  

   {  

       typedef unsigned int UINT;  

   }  

     

   void func2()  

   {  

       UINT uValue = 5;//error C2065: 'UINT' : undeclared identifier  

   }  

在类中用typedef定义的类型别名还具有相应的访问权限,【例2.3.4】:

   class A  

   {  

       typedef unsigned int UINT;  

       UINT valueA;  

       A() : valueA(0){}  

   };  

     

   void func3()  

   {  

     A::UINT i = 1;  

     // error C2248: 'A::UINT' : cannot access private typedef declared in class 'A'  

 }  

而给UINT加上public访问权限后,则可编译通过。

【例2.3.5】:

   class A  

   {  

   public:  

       typedef unsigned int UINT;  

       UINT valueA;  

       A() : valueA(0){}  

   };  

     

   void func3()  

 {  

     A::UINT i = 1;  

     cout << i << endl;  

 }  

注意:宏不是语句,结尾不需要加“;”,否则会被替换进程序中。

      如果宏不止一行,则在结尾加反斜线“\”符号。

#define HELLO "hello \

the world"

 

5. #define #const 的区别

1)编译器处理方式

define-在预处理阶段进行替换;

const—在编译时确定其值;

2)类型检查

define-无类型,不进行类型安全检查,可能产生意想不到的错误;

const—有数据类型,编译时会进行类型检查;

3)内存空间

define—不分配内存,给出的是立即数,有多少次使用就有多少次替换,在内存中就有多少拷贝,内存消耗大;

const—在静态存储区中分配内存,在程序运行过程中内存中只有一个拷贝;

4

宏定义的作用范围仅限于当前文件;

默认状态下,const对象只在文件内有效,当多个文件中出现了同名的const变量时,等同于在不同文件中分别定义了独立的变量。如果想在多个文件之间共享const对象,必须在变量定义之前添加extern关键字(在声明和定义时都要加)。

 

注意:C++ 程序中只使用const常量而不使用宏常量,即const常量完全取代宏常量。

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

#define宏定义详解 的相关文章

  • 【C/C++】报错问题积累

    1 出现Deprecated declaration XXX give arg types c文件中 有没有参数的函数时 声明需要加void即 main c void fun main h void fun void
  • IUnknown—COM和MFC

    转自 http hi baidu com zhangqiuxi blog item 6d9603ad9c8fe5084b36d6a0 html 问题 我用MFC编写COM程序有一段时间了 知道如何使用宏和嵌套类 以及如何在嵌套类中处理IUn
  • android通过JNI用C/C++创建本地文件

    通过jni在本地创建文件 1 在android studio创建基本的jni工程 并且在APP界面成功显示 Hello from C 不会的可以看android studio使用jni 2 在native lib cpp文件中创建文件 为了
  • 五. python面向对象(多态 和metaclass=abc.ABCMeta)

    一 多态 多肽 一种事物的多种形态 叫多肽 例如 动物 animal 猫 狗 animal py 文件 动物类 都有名字这个属性 和吃这个方法 class Animal object def init self name self name
  • std::nth_element bug引起的crash问题

    1 源码 auto less compare const MirroringGroup mg1 const MirroringGroup mg2 gt bool return mg1 usage lt mg2 usage std nth e
  • typedef struct 用法详解

    typedef为C语言的关键字 作用是为一种数据类型定义一个新名字 当typedef与结构结合使用时 会有一些比较复杂的情况 而且在C语言和C 里面有略有差别 本文将详细讲解typedef struct的用法 第一篇 typedef str
  • 互联网创业盈利模式指南

    看了很多创业的case 都有点下笔千言 离题万里的 情况 就是很多case都很精彩 但是公司 的价值最终是落实到 给创业者和投资人的回报的 因此 所有的case 最终都是 落实到盈利 模式上 一位投资人士说的很明确 中国的盈利模式很简单 就
  • 使用QZXing生成并解析二维码

    QZxing 是对 zxing 的一个封装 用于在 Qt 程序中加入条形码和二维码识别的功能 这里就讲讲如何编译和使用这个库 前几年 QZXing 的代码是放到 sourceforge net 上的 现在迁移到了 github com 所以
  • 如何学好C语言的数据结构与算法?

    C语言的数据结构与算法 难就难在链表 学会了链表 可能后面就一点都不难了 书籍推荐 数据结构与算法分析 C语言描述版 要深入学习的话可以选择这本书 因为针对链表的讲解是比较详细的 所以可以很快理解链表 跟着书上一点点实现基本操作 增删改查
  • LeetCode题目笔记——17.19消失的两个数字

    文章目录 题目描述 题目难度 困难 方法一 暴力 代码 代码优化 方法二 数学方法 代码 总结 题目描述 题目直达 题目难度 困难 方法一 暴力 虽然题目说你能在 O N 时间内只用 O 1 的空间找到它们吗 但是也没有限制我们不能用暴力
  • 值得学习与推荐的c/c++框架和函数库

    这几天不上班 翻翻Evernote中记录的一些笔记 刚好有时间把记录的一些好玩链接转载一下 这篇文章里提到的很多库都用过 尤其是图像处理相关库 尤其是opencv及cximage 当时做图像算法时 很多算法就是从上面找来 然后自己修改的 比
  • Trace Function Enter, Exit and Leave

    http developer nokia com community wiki Trace Function Enter Exit and Leave
  • C++:指向类的成员的指针

    引 想必接触过C的朋友们对C语言中指针的概念已经有了深入的了解 如果初步进行了解的朋友可以看一下 C语言基础学习笔记 指针展开来讲的基本知识点包括 指针的概念 指针的定义和初始化及简单使用 指针函数和函数指针 有关指针函数和函数指针的内容上
  • Open3D(C++)实现建筑物点云立面和平面分割提取

    Open3D C 实现建筑物点云立面和平面分割提取 近年来 点云技术在城市规划 机器人地图构建等领域得到广泛应用 本篇文章将介绍如何利用Open3D C 库实现建筑物点云立面和平面分割提取 准备工作 首先需要编译安装Open3D库 本文使用
  • 检查内存泄露

    自己编写的视频处理程序出现了一个问题 每帧的运行时间随着运行时间在不断增长 很大可能是出现了内存泄露 于是学习了一些查看内存泄露的方法 做了两种尝试 一是VS自带的DEBUG下的检测 view pl html view plain copy
  • 【数据结构/C++】树和二叉树_二叉链表

    include
  • C 语言教程:数据类型和格式说明符

    C 语言中的数据类型 C 中的变量必须是指定的 数据类型 并且您必须在 printf 函数中使用 格式说明符 来显示它 创建变量 int myNum 5 整数 没有小数点 float myFloatNum 5 99 浮点数 char myL
  • C/C++编程中的算法实现技巧与案例分析

    C C 编程语言因其高效 灵活和底层的特性 被广大开发者用于实现各种复杂算法 本文将通过10个具体的算法案例 详细探讨C C 在算法实现中的技巧和应用 一 冒泡排序 Bubble Sort 冒泡排序 Bubble Sort 是一种简单的排序
  • C++常见STL容器基本用法

    1 vector include
  • C++ 字符串比较------strcmp函数和strncmp函数

    strcmp 函数原型 int strcmp const char str1 const char str2 功能 strcmp函数会按照字典顺序逐个比较两个字符串的字符 直到遇到不同的字符或者遇到字符串结束符 0 返回值 该函数返回值如下

随机推荐

  • rabbitmq取消自动重连_rabbitmq客户端自动重连

    编程rookie 如有错误请指出 253065903 qq com RabbitMQ Node js 客户端 AMQP 0 9 1 V0 5 2 自动重连 重启策略 开始找解决方案 通过查看AMQP的源码 发现没有reconnect的选项
  • linux下使用bower时提示bower ESUDO Cannot be run with sudo解决办法

    今天准备在使用bower安装一些东西的时候 废了老半天劲 因为需要node环境以及bower平台 安装不顺利 通过百度 最解决了这些问题 在执行bower命令的时候 总是会报错 原来需要在命令后添加 allow root 选项 bower
  • 星星之火-36:LTE载波载波的间隔是15K, 载波波的带宽是多少? 15K还是30K?

    先给个结论 在LTE中 单个小区最大的频谱带宽为20M 每个子载波的间隔为15K 带宽为30K 一共可以分为1200个子载波 那这个数据是怎么来得呢 15K子载波间隔的由来 如果子载波的带宽30K 那么按照频分复用FDM的规则 频谱利用率最
  • Java 类、对象和方法

    Java 类 对象和方法 类的基础知识 如何创建对象 引用变量和赋值 方法 返回值 实参与形参 构造函数 垃圾回收机制 this关键字 类的基础知识 类是定义对象形式的模板 指定了数据以及操作数据的代码 Java中使用类的规范来构造对象 而
  • Qt - 富文本(富文本编程-语法高亮)

    富文本 QTextEdit支持富文本处理 即文档中可使用多种格式 如文字 图片 表格等 与纯文本PlainText相对而言 windows的记事本就是纯文本编辑器 word就是富文本编辑器 文档的光标主要基于QTextCursor类 文档的
  • 贵州大学计算机系2020年录取分数线,贵州大学2020年高考录取分数线汇总

    作为贵州省最好的大学 贵州大学一直是省内考生报考的热门学校 2020年 学校在贵州省招生类别有国家专项 地方专项 高校专项 本科一批 本科二批 艺术体育类 少数民族预科班等 由于本科二批 艺术体育类和少数民族预科班的录取分数线已经在动态里做
  • HttpServletRequestWrapper处理request数据流多次读取问题

    问题 要实现一个spring拦截器需要读取request数据流 但是request数据流只能读取一次 需要自己实现HttpServletRequestWrapper对数据流包装 实现如下 public class ReadHttpServl
  • ov9650摄像头驱动之——linux内核v4l2架构分析2

    NO 2 Camera解码器 控制器 1 根据camera控制器的描述 图像传输有两个DMA通道 我们用的是C通道 所以先将DMA内存初始化 因为在V4L2操作中有把VIDIOC REQBUFS中分配的数据缓存转换成物理地址的操作 所以DM
  • ctfshow

    第三题 1 抓包 2 发送到repeater 获得flag 第四题 robots txt是一种存放于网站根目录下的ASCII编码的文本文件 它通常告诉网络搜索引擎的漫游器 又称网络蜘蛛 此网站中的哪些内容是不能被搜索引擎的漫游器获取的 哪些
  • Linux(centos7.9)常用命令大全及基础知识

    linux中数组的索引从0开始 其他默认从1开始 例如没有第0列 从第1列开始 在Unix中一切 包括网络套接口 都是文件 在命令行中 无论几个空格 都当成一个空格看待 在linux中 在命令行中通过执行命令的方式来改变系统或软件配置时 效
  • mysql数据库管理工具 h_几款桌面MYSQL管理工具

    1 Navicat Navicat是一个强大的MySQL数据库管理和开发工具 Navicat导航为专业开发者提供了一套强大的足够尖端的工具 但它对于新用户仍然 是易于 学习 Navicat 使用了极好的图形用户界面 GUI 可以让你用一种安
  • 数据预处理——数据无量纲化(归一化、标准化)

    文章目录 1 数据归一化 1 1 数据归一化定义 1 2 MinMaxScaler 归一化 1 3 MinMaxScaler 使用样例 2 数据标准化 2 1 数据标准化定义 2 2 StandardScaler 标准化 2 3 Stand
  • python如何求列表的平均值_python如何求列表平均值?

    推荐教程 python视频教程 python如何求列表平均值 python函数求列表平均值的方法 用法 mean matrix axis 0 其中matrix为一个矩阵 axis为参数 以m n矩阵举例 axis不设置值 对 m n 个数求
  • mysql基础命令

    1 常用命令 1 create database db name 创建数据库 2 show databases 显示所有的数据库 3 drop database db name 删除数据库 4 show tables 显示数据表 5 des
  • 三菱j4伺服中文说明书_三菱伺服抱闸伺服的使用方法

    刹车原理 伺服电机的刹车抱闸和普通的电磁抱闸原理是一样的 靠电磁线圈产生磁场吸力 克服机械刹车片的弹簧制动力矩 驱动机械刹车片的分开 释放电机轴 一般三菱伺服的刹车都是直流24V电源 他的刹车是不分正负极 很多初次使用的工控人员都会纠结这个
  • 网站设计之常见简单实用的JavaScript特效总结(上篇)

    这篇主要是总结JavaScript常见简单实用的特效 主要从代码量短 简单实用几个方面进行叙述 其中特效包括 1 鼠标悬停图片切换查看器 2 鼠标移动图片放大 3 鼠标移动切换内容 4 贵财下拉菜单案例 5 JS图片放大镜功能 类似淘宝 6
  • 【无标题】文件查找、运行项目(网站)HTML5(H5)、压缩---解压缩

    一 登录系统 用户名 root 密钥对 安全组 云服务器 来源 0 0 0 0 0 端口 ALL TCP 80 策略 允许 物理服务器 虚拟机 systemctl stop firewalld 关闭防火墙 setenforce 0 关闭se
  • ethers.js 应用(助记词、地址、私钥)

    1 创建助记词 const ethers require ethers let wallet ethers Wallet createRandom let mnemonic wallet mnemonic console log mnemo
  • MybatisPlus整合Flowable出现的坑

    MybatisPlus整合Flowable出现的坑 摘要 现在在项目中使用的MybatisPlus 最近研究了一下流程框架Flowable 看了很多技术文档博客 打算直接整合进去 先记录一下遇到的问题 问题 Description file
  • #define宏定义详解

    define宏定义 1 常规用法 无参宏 define PI 3 1415926 define EN 1e5 定义指数1 10e5 cout lt