#define用法总结

2023-10-29

刚开始接触VC++的同学们,估计对这个东西有这莫大的恐惧。这个经常写在添加头文件的地方的奇怪语句。

如果看过mfc那么,那么拿出一些application framework里面的宏,估计会吓死一片。说了这么多只是想说,不明白其用法的人很害怕,但要是知道它,熟悉它,那么你会觉得它很美妙。

 

进入正题:

#define的个用法:

 

1:#define MAX  0x18

第一个用法意义就在于定义标识符,这个比较常见而且也比较容易理解。将MAX的地方看做是0x18。

 

2:#define afx_msg 

这个可能不常见,但实际上很常见,在mfc里面经常看到某个消息处理函数的前面就是afx_msg,但是究其根源会发现如上定义,

原来啊,#define可以将标识符定义为空,那么mfc为什么要定义呢,这个是项目规划的问题了。可能以后要在afx_msg后面添加

什么东西呢,但更重要的这种宏可以用于提供附加信息。一个用afx_msg修饰的函数,可以让读者很容易知道这个函数是一个处理消息的函数!且这个用经常用在头文件包含方面,后面会讲。

 

3:#define MAX(a,b)  a>b?a:b

这个就是#define最大的用处了可以说,这个称为定义宏。可以当函数使用。但为什么可以当函数使用呢?就在于#define的根本,

不管他是定义标识符也好,定义宏也好,说本质就是个文本替换。所以有了上面的宏定义。那么你可以写出这样的代码。

 

#define MAX(a,b) a>b?a:b

 

void main()

{

 int a=1;

 int b=2;

 int c=MAX(a,b);

}

 

那么关键的那行代码就在编译的时候被替代成:int c=a>b?a:b;这是?:语法。大家都知道可以得到最大值。

不过呢?实际使用的时候我们采取一个原则,分层加括号原则,上面的宏采用这个原则改写后:

#define MAX(a,b) (a>b?a:b)

 

为什么要这么写呢?请看下面代码:

int c = a * MAX(a,b);

如果采用一开始的写法,展开如下:

int c = a * a >b?a:b;

看到了,最大值比较的是a*a和b。所以出错了!

但采用分层之后就肯定不会错了,分层加括号方法展开如下:

int c = a * (a > b? a: b);

 

所以大家以后写宏的时候记得要用分层加括号原则。

 

4:#define TOSTR(x) #x

其实这也是宏,只不过用来引出几个宏定义中常用的语法。

上面的宏将x变成字符串x。下面是三个常用的:

#define TOSTR(X) #X                               //TOSTR(xujie)代表:"xujie"

#define ADDPRE(X) add##X                    //ADDPRE(xujie)代表:addxujie        //注意这可不是字符串

#define TOCHAR(X) #@x                          //TOCHAR(x)代表:'x'

 

#代表:将宏参数转换成字符串

##代表:将##左右的标识符连接成一个,但不是字符串

#@代表:将宏参数转换成单个字符

 

5:#define IMPLEMENT_SERIAL(theClass,baseClass)     IMPLEMENT_DYMCREATE(theClass,baseClass)/

      CObject* PASCAL CreateObject() {/

      return cass##theClass}

这是一个三行宏,那么其实语法就一点,#define后面出现的第一个标识符,将代替后面多行代码。同一宏之间的多行代码用/连接在一起。

 

用上简单的宏语法在加上多行注释,再加上Microsoft那帮疯子,就出现了我们mfc里面精妙绝伦的宏了。

也请注意将#define和typedef做区别,前几个博客已经讲明了。

 

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

#define用法总结 的相关文章

  • -ffast-math 可以安全地用于典型项目吗?

    在回答我建议的问题时 ffast math 有评论指出这是危险的 我个人的感觉是 在科学计算之外 是可以的 我还假设严肃的金融应用程序使用定点而不是浮点 当然 如果你想在你的项目中使用它 最终的答案是在你的项目上测试它 看看它有多大影响 但
  • 从服务器下载图像(cUrl,但接受建议)C++

    我试图通过从服务器 网站 下载图像来设置旋转背景图像 并尝试使用curl 来执行此操作 但是在执行此操作方面取得了0 成功 我的代码的 缩短的 版本如下 我没有收到错误 但是 如何 临时 保存该图像以将其显示为背景 是否有图像 类型变量 或
  • 如何获取枚举数作为常量?

    From 枚举中定义的项目总数 https stackoverflow com questions 856154 total number of items defined in an enum 我发现我可以使用以下方法获取枚举数 Enum
  • 如何反序列化 XML 文档

    如何反序列化此 XML 文档
  • 如何在 Google Mock 中使用可选参数来模拟方法?

    如何使用可选参数模拟方法谷歌模拟 例如 class A public void set enable bool enabled true class MockA public A MOCK METHOD1 set enable void b
  • 以编程方式更新 Wifi 网络

    我正在尝试创建一个程序 当某个 wifi 网络在范围内时 该程序会连接到该网络 即使已经连接到另一个 wifi 也是如此 我在用着简单Wifi https github com DigiExam simplewifi 基本上效果很好 除了在
  • 图片框、双击和单击事件

    我有一个奇怪的问题 我有一个图片框双击事件以及单击事件 问题是即使我双击该控件 也会引发单击事件 如果我禁用单击事件 则双击事件正在工作 这个问题已经在这里讨论过 https stackoverflow com questions 1830
  • 如何在单例类和未命名类之间进行选择?

    我会使用这样的单例 Singleton single Singleton instance single gt do it 我会使用这样的未命名类 single do it 我觉得单例模式除了具有可读的错误消息之外 与未命名的类相比没有任何
  • MVC BaseController 处理 CRUD 操作

    我想重构我的基本 CRUD 操作 因为它们非常重复 但我不确定最好的方法 我的所有控制器都继承 BaseController 如下所示 public class BaseController
  • 在编译输出中添加程序集绑定 (app.config)

    如果我编译应用程序 则会在输出中自动添加程序集绑定 具体的程序集绑定不在app config在 Visual Studio 中但在创建的应用程序配置中 有什么办法可以检查为什么会自动添加程序集绑定吗 选项AutoGenerateBindin
  • 在 C++ 中,为什么 const 也可以工作时编译器选择非常量函数? [复制]

    这个问题在这里已经有答案了 例如 假设我有一堂课 class Foo public std string Name m maybe modified true return m name const std string Name cons
  • 如何在 C++11 中返回类成员向量

    我读了几篇关于如何从方法返回向量的文章 其中包括 c11 右值和移动语义混淆返回语句 https stackoverflow com questions 4986673 c11 rvalues and move semantics conf
  • 我想找到 C# 代码中所有后面没有括号的 if 语句。通过正则表达式

    我想找到所有if声明和for后面没有大括号的语句 当你在一个文件中写入一行时if声明您大多不会将其括在大括号中 所以我想找到所有这些if and for声明 请帮忙 就像我想捕捉这个声明 if childNode Name B return
  • 大小为 k 的非连续子序列的最大值的最小值

    在开始之前 我希望这个问题不是重复的 我发现了几个类似的问题 但它们似乎都没有描述完全相同的问题 但如果它是重复的 我会很高兴看到一个解决方案 即使它与我的算法不同 我一直在尝试回答这个问题 https stackoverflow com
  • Qt 多重继承和信号

    由于 QObject 我在 QT 中遇到了有关多重继承的问题 我知道很多人也有同样的问题 但我不知道该如何解决 class NavigatableItem public QObject Q OBJECT signals void desel
  • 批量插入,asp.net

    我需要获取与会员相对应的 ID 号列表 在任何给定时间处理的数量可能在 10 到 10 000 之间 我可以毫无问题地收集数据 解析数据并将其加载到 DataTable 或任何内容 C 中 但我想在数据库中执行一些操作 将所有这些数据插入表
  • 在 C 中运行 setuid 程序的正确方法

    我有一个权限为4750的进程 我的Linux系统中存在两个用户 root 用户和 appz 用户 该进程继承以 appz 用户身份运行的进程管理器的权限 我有两个基本惯例 void do root void int status statu
  • C# 中的 mshtml.HTMLDocumentClass

    在 C 中 我设法从 InternetExplorer 对象获取整个 HTMLDocumentClass 导航到某个 URL 然而 在 Visual Studio 2008 的调试模式下 该特定 URL 的 HTMLDocumentClas
  • 在for循环中声明和初始化变量

    可以简单写一下吗 for int i 0 代替 int i for i 0 在 C 或 C 中 并且会变量i只能在循环内部访问 它在 C 中有效 它在 C 的原始版本中是不合法的 但在 C99 中被采用为 C 的一部分 当时一些 C 功能被
  • 如何正确处置注入的DLL线程?

    我将一个 DLL 注入到目标进程中 以在玩 MMORPG 时充当助手 当前功能将按键转换为鼠标点击 因为 MMORPG 要求用户移动鼠标才能实现某些功能 这是我所鄙视的 假设我出于某种原因想要取消注入 DLL 我该怎么做呢 这个方法干净吗

随机推荐

  • el-input验证规则

    rules people 在未输入任何内容情况下触发 required true message 请输入你的内容 trigger blur 在输入非数字或不是1 100之间的整数时触发 pattern 0 1 9 0 9 100 0 9 0
  • 剑指 Offer 56 - I. 数组中数字出现的次数(java+python)

    一个整型数组 nums 里除两个数字之外 其他数字都出现了两次 请写程序找出这两个只出现一次的数字 要求时间复杂度是O n 空间复杂度是O 1 示例 1 输入 nums 4 1 4 6 输出 1 6 或 6 1 示例 2 输入 nums 1
  • java中代码块的执行顺序

    执行顺序 父类静态代码块 gt 子类静态代码块 gt 父类构造块 gt 父类构造方法 gt 子类构造块 gt 子类构造方法 注意 静态代码块只执行一次 并且是在main之前执行 构造块就是非静态代码块 执行顺序 父类静态代码块 只执行一次
  • scrapy爬虫框架简绍与安装使用

    Scrapy Scrapy是一个为了爬取网站数据 提取结构性数据而编写的应用框架 其可以应用在数据挖掘 信息处理或存储历史数据等一系列的程序中 其最初是为了页面抓取 更确切来说 网络抓取 所设计的 也可以应用在获取API所返回的数据 例如
  • 简单说一说手机中常用的芯片-OVP芯片

    什么是OVP OVP Over Voltage Protection 即过压保护 电压值超过一定值后 对后级电路起到了保护作用 避免因输入电压过大 导致后级电路损坏 过压保护的方式有很多种 然而运用在手机端的 往往是采用OVP芯片 价格实惠
  • mysql 索引 长文本 失败_MySQL: 长文本字段上建索引的有关问题与解决方案_mysql

    mysql 长文本字段上建索引的问题与解决方案 文本字段越长 在这个字段上建索引的代价就越高 为了解决这个问题 可以为这个字段配一个hash字段 然后在这个hash字段上建索引 如 select from log where url has
  • 微信小程序开发【前端+后端(java)】

    前言 现在微信小程序越来越火了 相信不少人都通过各种途径学习过微信小程序或者尝试开发 作者就是曾经由于兴趣了解开发过微信小程序 最终自己的毕业设计也是开发一个微信小程序 所以现在用这篇博客记录我之前开发的一些经验和一些心得吧 主要内容 sp
  • unity网络实战开发(丛林战争)-正式开发阶段(015-游戏场景及开始界面UI搭建)

    使用工具 VS2017 unity3d 使用语言 c 作者 Gemini xujian 参考 siki老师 丛林战争 视频教程 上一篇文章中 我已经完成了游戏客户端与服务器端的初步连接 接下来将开始进行游戏场景与开始界面UI的搭建 01 控
  • 我的YAF论坛(Yet Another Forum)的部署方法

    网上已经有一些关于YAF论坛 Yet Another Forum 的部署方法 在这里我也写一下自己的部署方法 希望能对大家有帮助 我部署的YAF的版本是v1 9 1 6 写这文章的时候 v1 9 1 8刚出几天呢 基于学习目的我是直接使用源
  • 使用Ahk2Exe工具将AutoHotKey脚本打包到Windows可执行文件

    写在前面的两点说明 1 我的操作系统版本为Win7 AutoHotKey版本为1 1 23 05 2 因AutoHotKey单词太长 所以在下文中统一用缩写AHK代替 方法一 通过Windows上下文菜单快速创建EXE文件 用鼠标右键单击a
  • 怎样在python 上输入文字_python如何实现手动输入文字

    Python中可以使用input 函数接收用户输入的文字 函数语法 input prompt 参数说明 prompt 提示信息 示例 gt gt gt a input input input 123 输入整数 gt gt gt type a
  • C#数组 添加元素

    例1 string a new string 1 2 3 给a追加一个 4 string a new string 1 2 3 List b a ToList b Add 4 a b ToArray 例2 有两个个数组byte s1 1 2
  • 堆和栈的区别(转过无数次的文章)

    一 预备知识 程序的内存分配 一个由C C 编译的程序占用的内存分为以下几个部分 1 栈区 stack 由编译器自动分配释放 存放函数的参数值 局部变量的值等 其 操作方式类似于数据结构中的栈 2 堆区 heap 一般由程序员分配释放 若程
  • unity Texture2d Base64 相互转换

    Base64ToTexture2D public Texture2D Base64ToTexture2D string Base64STR Texture2D pic new Texture2D 190 190 TextureFormat
  • java连接数据库

    学习目标 java连接数据库 学习内容 导入Jar驱动包 1 然后右击项目文件夹 打开模块设置 2 打开后按一下方式操作 3 找到刚才粘贴的jar包选择 4 勾选应用 2 注册驱动 Class forName com mysql jdbc
  • 使用setStyleSheet来设置图形界面的外观

    关于QPushButton的问题 hover press我用setStyleSheet为一个QPushButton贴了一个背景图片 但是 当点了按钮之后 会出现虚线框 这样看起来就很丑 不逼真了 我不希望这个虚线框出现 有什么好的解决方法吗
  • Python利用POP3/SMTP服务自动发送qq邮件

    自动发送qq邮件的两种方法 第一种 POP3 SMTP服务发送qq邮件 废话不多说 直接上代码 coding utf 8 import smtplib from email mime text import MIMEText from em
  • HTML页面

    HTML 1 资源分类 1 1 静态资源 使用静态网页开发技术发布的资源 特点 所有用户访问 得到的结果是一样的 如 文本 图片 音频 视频 HTML CSS JavaScript 如果用户请求的是静态资源 那么服务器会直接将静态资源发送给
  • [每日两题系列]刷算法题咯~~

    今日题目 判定是否互为字符重排 最后一块石头的重量 本系列所选题目均来自力扣或者牛客网站 所选题目主要是以其中的简单题为主 中等题为辅 包含少数困难题 原因是 本人目前能力还不够 开展这个系列的目的是督促自己 在暑假的时间里也要保持有一定的
  • #define用法总结

    刚开始接触VC 的同学们 估计对这个东西有这莫大的恐惧 这个经常写在添加头文件的地方的奇怪语句 如果看过mfc那么 那么拿出一些application framework里面的宏 估计会吓死一片 说了这么多只是想说 不明白其用法的人很害怕