Windows内存管理 - 使用宏、断言

        DDK提供了大量的宏。在使用这些宏的时候,要注意一种错误的发生,这就是“侧效”(Side Effect)。

        宏一般由多行组成,如下面的形式,其中“\”代表换行。

#define PRINT(msg) KdPrint(("===============\n")); \KdPrint(msg);    \KdPrint(("===============\n"));


        
        在C语言中规定,for或者if语句块中的内容如果只是一句,可以省略掉{}。如:

if(ret)
{Foo();
}

        等价于

if(ret)Foo();

        但如果Foo是宏而非函数时,就会产生逻辑错误。

if(bRet)PRINT(msg);

等价于

if(bRet) KdPrint(("===============\n")); \KdPrint(msg);    \KdPrint(("===============\n"));

        这明显和我们开始的想法不一致。产生这样的错误,称为“侧效”错误。“侧效”错误很难被发现,因为程序员很难判断Foo是函数还是宏。

        解决这个问题,一般有两个办法。
        1. 对于if、while、for这样的语句,不省略{}。这样是最保险的做法,能完全保证不出现“侧效”错误。

        2. 在编写多行宏的时候,在宏的前后加上{}。如下面的形式,其中“\”代表换行。
#define PRINT(msg) {KdPrint(("===============\n")); \
        KdPrint(msg);    \
        KdPrint(("===============\n")); \
        }
这种方法能保证这个宏在调用时,不出现“侧效”错误。


断言
        在驱动程序开发中,还有一个技巧,就是使用“断言”。在驱动程序使用“断言”,一般是通过使用ASSERT宏。例如:

NTSTATUS Foo(PCHAR* str)
{
    ASSERT(str!=NULL);// 断言
    
    // 对str的操作
}

        这段代码认为输入参数绝不可能是空指针,因此在函数的开头做一个断言(ASSERT)。一旦断言失败,会引发一个异常。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/12231.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

商务分析方法与工具(八):Python的趣味快捷-年少不知numpy好,再见才觉很简单

Tips:"分享是快乐的源泉💧,在我的博客里,不仅有知识的海洋🌊,还有满满的正能量加持💪,快来和我一起分享这份快乐吧😊! 喜欢我的博客的话,记得…

MySQL数据库核心面试题

数据库中的引擎 常用的引擎有InnoDB、MyIsam、Memory三种。 MyIsam:组织形式分为三种: frm文件存储表结构、MyData文件存储表中的数据、MyIndex文件存储表的索引数据。是分开存储的。 Memory:基于内存的,访问速度快&#xff0…

C++11特性(二)

文章目录 右值引用和移动语义左值引用和右值引用左值与左值引用右值与右值引用 右值引用有什么用完美转发与万能引用 右值引用和移动语义 左值引用和右值引用 所谓的引用就是给变量起别名,那么左值引用和右值引用的区别其实就在于左值和右值 左值与左值引用 左值…

算法_前缀和

DP34 【模板】前缀和 import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别int n in.nextInt(),q in.ne…

JavaFX布局-HBox

JavaFX布局-HBox 常用属性alignmentspacingchildrenmarginpaddinghgrow 实现方式Java实现Xml实现 综合案例 HBox按照水平方向排列其子节点改变窗口大小,不会该部整体布局窗口太小会遮住内部元素,不会产生滚动条 常用属性 alignment 对齐方式 new HBox().setAlign…

Angular前端项目在Apache httpd服务器上的部署

Apache Httpd和Tomcat主要区别:Tomcat是一个Java Servlet容器,用于运行Java Servlet和JavaServer Pages(JSP),而Apache HTTP服务器是一个通用的Web服务器,用于提供静态和动态内容。 Apache httpd安装&#…

RT Thread + CLion环境搭建

RT Thread CLion环境搭建 0.前言一、准备工具1. Env RT Thread v5.12.CLion安装3.编译及下载工具 二、新建Env工程三、CLion配置四、运行测试 0.前言 事情的起因是最近在使用RT Thread Studio时,发现默认的 rtt 内核版本及交叉编译链版本都过于陈旧,于…

SpringBoot 表单提交参数绑定 List 下标越界,超过 256,报数组越界异常

文章目录 》原因》解决方案 》原因 Spring Validation 的 org.springframework.validation.DataBinder 类中默认限制,表单提交 List 元素数量超过 256 时就会抛出异常 public class DataBinder implements PropertyEditorRegistry, TypeConverter {/** Default li…

JS算法-十大排序算法(上)

思想小剧场 如果我的相对论被证明是正确的,德国人就会说我是德国人,法国人会说我是一个世界公民;如果我的相对论被否定了,法国佬就会骂我是德国鬼子,而德国人就会把我归为犹太人。—爱因斯坦 以下案例都是升序 const a…

《无畏契约》游戏画面出现“撕裂感“,你清楚背后的原理吗?

🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏:🍕 Collection与数据结构 (91平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 🧀Java …

信息化总体架构方法_2.信息化工程建设方法

1.信息化架构模式 信息化架构一般有两种模式,一种是数据导向架构,一种是流程导向架构。对于数据导向架构重点是在数据中心,BI商业智能等建设中使用较多,关注数据模型和数据质量;对于流程导向架构,SOA本身就…

黑马程序员鸿蒙HarmonyOS端云一体化开发【13-15】

前置知识:arkts 一套开发工具,一套语言,搞定客户端和云端两个的编写。其中application就是客户端,cloudProgram就是云端。 开发人员->全栈开发工程师,降低了开发成本,且提供了很多现成的云服务&#xf…

AI原生实践:测试用例创作探索

测试用例作为质量保障的核心,影响着研发-测试-发布-上线的全过程,如单元测试用例、手工测试用例、接口自动化用例、UI 自动化用例等,但用例撰写的高成本尤其是自动化用例,导致了用例的可持续积累、更新和迭代受到非常大制约。长久…

Python并发编程 05 锁、同步条件、信号量、线程队列、生产者消费者模型

文章目录 一、基础概念二、同步锁三、线程死锁和递归锁四、同步条件(event)五、信号量六、线程队列(queue)1、常用方法2、queue模块的三种模式(1)FIFO队列(2)LIFO队列(3&…

【JS面试题】原型原型链

一、面试真题展示: 1. 如何准确判断一个变量是不是数组? ① 使用instanceof进行判断:a instanceof Array ② 使用Array.isArray()进行判断:Array.isArray(a) 2. 手写一个简易的jQuery,考虑插件和扩展性? …

内网工具之LDP的使用

LDP 是微软自带的一款活动目录信息查询工具,在域控的 cmd 窗口执行 ldp 命令即可打开 LDP 工具。普通域成员主机默认是没有 LDP 工具的,可以自行上传ldp.exe 工具上去查询活动目录信息。不在域内的机器,也可以通过上传 ldp.exe 工具上去执行。…

tomcat--目录结构和文件组成

目录结构 目录说明bin服务启动,停止等相关程序和文件conf配置文件lib库目录logs日志记录webapps应用程序,应用部署目录workjsp编译后的结果文件,建议提前预热访问 /usr/local/apache-tomcat-8.5.100/work/Catalina/localhost/ROOT/org/apac…

c++string类型

概述 string类型是c的字符串类型&#xff0c;其继承自basic_string类。使用string需要导入头文件#include <string>,并且在命名空间std下。cstring是否是写时复制? (像Qt的string一样)? 经过自己的测试&#xff0c;推断&#xff0c;c的方式不是写时复制&#xff0c;其在…

PingCAP 戴涛:构建面向未来的金融核心系统

作者&#xff1a;戴涛 导读 近日&#xff0c;平凯星辰解决方案技术部总经理戴涛在 2024 数据技术嘉年华活动中&#xff0c;做了主题为“构建面向未来的金融核心系统”的分享&#xff0c;本文为戴涛演讲实录的全文。 文章分析了中国金融行业的发展趋势&#xff0c;并且基于这…

在 Mac OS 上使用 Homebrew 打造便捷的软件安装体验:apt-get install 就是brew install:

标题&#xff1a;在 Mac OS 上使用 Homebrew 打造便捷的软件安装体验 在 Mac OS 系统中&#xff0c;虽然不支持 apt-get install&#xff0c;但我们有幸拥有 Homebrew 这样出色的包管理器。它为我们在 Mac 上安装各种所需软件提供了极大的便利。 一、安装 Homebrew 要安装 Home…