动态断言与静态断言

1. assert 宏

运行时断言 所在的头文件
#include< assert.h > 或 #include< cassert >
assert 的定义依赖于标准库不定义的另一个宏 NDEBUG
若 NDEBUG 在包含了 <assert.h> 的源代码中的点定义为宏名,则 assert 不做任何事。
若不定义 NDEBUG ,则 assert 将其参数(必须拥有标量类型)与零比较相等。若相等,则 assert 在标准错误输出上输出实现指定的诊断信息,并调用 abort() 。诊断信息要求包含表达式的文本,还有预定义变量 func 与 (C99 起)预定义宏 FILELINE 的值

assert(N>0 && "这里的N必须要大于0");

2. 静态断言 static_assert

static_assert 是 C++11 引入的一个编译时断言机制,它允许程序员在编译阶段检查某些条件是否成立。如果条件不成立,编译器会发出错误信息,从而阻止代码的编译。这在模板编程和类型安全方面尤其有用,可以帮助开发者在编译时捕捉错误
static_assert 用好了,可以帮助我们在编译的时候就能发现很多问题,下面给出几个常用的场景

  1. 模板编程
#include <iostream>
#include <type_traits>template <typename T>
void process(T value) {static_assert(std::is_integral<T>::value, "Template parameter T must be an integral type!");std::cout << "Processing integral value: " << value << std::endl;
}int main() {process(42);          // 正常工作// process(3.14);    // 编译错误:Template parameter T must be an integral type!return 0;
}	
  1. 常量条件检查
#include <iostream>template <typename T, std::size_t N>
void checkArraySize(T(&)[N]) {static_assert(N > 10, "Array size must be greater than 10!");std::cout << "Array size is: " << N << std::endl;
}int main() {int arr[11];checkArraySize(arr); // 正常工作// int emptyArr[0]; // 编译错误:Array size must be greater than 10!// checkArraySize(emptyArr);return 0;
}
  1. 类型安全
#include <iostream>
#include <type_traits>int main() {std::string s1;std::string s2;const char* s3;static_assert(std::is_same<decltype(s1), decltype(s2)>::value, "must the same type"); // 编译通过static_assert(std::is_same<decltype(s1), decltype(s3)>::value, "must the same type"); // 编译不通过return 0;
}

3. 优点

  • assert 是一个强大的工具,用于在开发和调试阶段捕捉逻辑错误;在生产环境中,通过定义 NDEBUG 可以禁用所有的断言,从而提高性能。
  • static_assert 提供了在编译时检查条件的能力,从而避免了运行时错误;当条件不满足时,编译器提供的错误信息可以帮助开发者快速定位问题. 提高代码安全性.

4. 注意事项

  • assert 使用时应注意避免副作用,不要把有效的逻辑传入, 并将其与适当的错误处理机制结合使用。
  • static_assert 只能用于编译时可求值的表达式,因此不能用于运行时条件。
  • 如果 static_assert 的条件为假,编译器将产生错误并停止编译,错误信息将包含你提供的字符串。

5. 总结

除了经典的 assert 在 DEBUG 下运行时检查, 强大的C++11 引入 static_assert 重要特性,用于在编译时进行条件检查。它可以帮助开发者确保类型和常量的正确性,提高代码的安全性和可维护性。通过合理使用 static_assert,可以在编译阶段捕获潜在的错误,从而减少运行时错误的可能性。

对应的视频链接
https://www.bilibili.com/video/BV1Rh6bY1EmK/?p=2

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

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

相关文章

Oracle 数据库执行计划的查看与分析技巧

目录 Oracle 数据库执行计划的查看与分析技巧一、什么是执行计划二、查看执行计划的方法&#xff08;一&#xff09;使用 EXPLAIN PLAN 命令&#xff08;二&#xff09;通过 SQL Developer 工具查看&#xff08;三&#xff09;启用 AUTOTRACE 功能 三、执行计划中的关键信息解读…

【最新】沃德协会管理系统源码+uniapp前端+环境教程

一.系统介绍 一款基于FastAdminThinkPHPUniapp开发的商协会系统&#xff0c;新一代数字化商协会运营管理系统&#xff0c;以“智慧化会员体系、智敏化内容运营、智能化活动构建”三大板块为基点&#xff0c;实施功能全场景覆盖&#xff0c;一站式解决商协会需求壁垒&#xff0…

向bash shell脚本传参

例子&#xff1a; ~ script % touch parameter.sh ~ script % chmod 755 parameter.sh ~ % vim parameter.shparameter.sh: #!/usr/bin/env bashecho the name of current script is $0echo the first parameter is $1echo the second parameter is $2echo all parameters: $…

玩转树莓派Pico(20): 迷你气象站6——软件整合改进

前言 上次写的代码虽然能达到预期效果&#xff0c;但还是有很多问题的&#xff1a; 主程序main.py包含太多的内容&#xff0c;比较凌乱&#xff0c;因此整体设计要重新调整&#xff1b;没有日志功能&#xff0c;脱离电脑运行时根本不知道情况。比如有时断电重启后就不发送数据…

【LeetCode: 83. 删除排序链表中的重复元素 + 链表】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

算法练习——模拟题

前言&#xff1a;模拟题的特点在于没有什么固定的技巧&#xff0c;完全考验自己的代码能力&#xff0c;因此有助于提升自己的代码水平。如果说一定有什么技巧的话&#xff0c;那就是有的模拟题能够通过找规律来简化算法。 一&#xff1a;替换所有问号 题目要求&#xff1a; 解…

Idea创建JDK17的maven项目失败

Idea创建JDK17的maven项目失败 Error occurred during initialization of VM Could not find agent library instrument on the library path, with error: Can’t find dependent libraries Possible solution: Check your maven runner VM options. Open Maven Runner setti…

VSCode设置Playwright教程

1.安装扩展 打开VS Code&#xff0c;在扩展—>搜索"Playwright Test for VSCode"&#xff0c;点击安装 按快捷键CommandShiftP&#xff0c;输入install playwright&#xff0c;点击安装Playwright 安装成功会有如下提示 2.调试脚本 打开tests/example.spec.ts文…

HarmonyOS Next“说书人”项目 单机版 实践案例

前段时间开发了一个软件&#xff0c;取名为“说书人”&#xff0c;后由于备案暂时没有通过&#xff0c;于是删除了联网功能&#xff0c;重新做了一个单机版&#xff0c;这里对于单机版的开发实践案例进行一个发出&#xff0c;希望能帮助到大家 文章最后给出了AtomGit仓库地址 p…

HTML新特性|01 音频视频

音频 1、Audio (音频) HTML5提供了播放音频文件的标准 2、control(控制器) control 属性供添加播放、暂停和音量控件 3、标签: <audio> 定义声音 <source> 规定多媒体资源,可以是多个<!DOCTYPE html> <html lang"en"> <head><…

像素的访问和算术运算

【欢迎关注编码小哥&#xff0c;学习更多实用的编程方法和技巧】 一、常用的访问像素的方法 1、使用at()方法 // 灰度图 cv::Mat grayImage; for (int y 0; y < grayImage.rows; y) {for (int x 0; x < grayImage.cols; x) {uchar pixel grayImage.at<uchar>…

【深度学习】卷积网络代码实战ResNet

ResNet (Residual Network) 是由微软研究院的何凯明等人在2015年提出的一种深度卷积神经网络结构。ResNet的设计目标是解决深层网络训练中的梯度消失和梯度爆炸问题&#xff0c;进一步提高网络的表现。下面是一个ResNet模型实现&#xff0c;使用PyTorch框架来展示如何实现基本的…

js的讲解

Proxy 是 ES6&#xff08;ECMAScript 2015&#xff09;中引入的一个新的内置对象&#xff0c;用于定义某些操作的自定义行为&#xff08;如属性查找、赋值、枚举、函数调用等&#xff09;。Proxy 可以被看作是一个拦截器&#xff0c;它拦截并自定义对象上的基本操作。通过创建一…

雷电「模拟器」v9 最新清爽去广

前言 雷电模拟器9是基于安卓9内核开发的全新版本模拟器 安装环境 [名称]&#xff1a;雷电「模拟器」 [大小]&#xff1a;579MB [版本]&#xff1a;9.1.34 [语言]&#xff1a;简体中文 [安装环境]&#xff1a;Windows 通过网盘分享的文件&#xff1a;雷电模拟器 链接:…

大模型 API 接入初探

文章目录 大模型 API 接入初探一、使用大模型 API 的前置步骤&#xff08;一&#xff09;注册账户与获取凭证&#xff08;二&#xff09;理解 API 文档 二、三个常用 API&#xff08;一&#xff09;列出模型&#xff08;二&#xff09;FIM 补全&#xff08;三&#xff09;对话补…

ACPI PM Timer

ACPI PM Timer 概述&#xff1a; ACPI PM Timer是一个非常简单的计时器&#xff0c;它以 3.579545 MHz 运行&#xff0c;在计数器溢出时生成系统控制中断&#xff08;SCI&#xff09;。它精度较低&#xff0c;建议使用其他定时器&#xff0c;如HPET或APIC定时器。 检测ACPI P…

力扣--LCR 188.买卖芯片的最佳时机

题目 数组 prices 记录了某芯片近期的交易价格&#xff0c;其中 prices[i] 表示的 i 天该芯片的价格。你只能选择 某一天 买入芯片&#xff0c;并选择在 未来的某一个不同的日子 卖出该芯片。请设计一个算法计算并返回你从这笔交易中能获取的最大利润。 如果你不能获取任何利…

工业相机基本参数

分辨率&#xff08;Resolution&#xff09; 定义&#xff1a;分辨率指的是相机图像的像素数&#xff0c;通常以 宽度 x 高度 的形式表示&#xff0c;如 1920x1080 或 2592x1944。作用&#xff1a;分辨率越高&#xff0c;相机可以捕捉到更多的细节。高分辨率相机适用于需要精确…

实时在线翻译谷歌插件

Real - time Translation插件的安装 1、下载插件并解压 2、打开谷歌浏览器&#xff0c;在地址栏输入 “chrome://extensions/” 进入扩展程序页面. 3、开启页面右上角的 “开发者模式”. 4、点击 “加载已解压的扩展程序” 按钮&#xff0c;选择之前解压的文件夹&#xff0c;点…

torch.sparse_csc_tensor

torch.sparse_csc_tensor 以CSC格式构建一个稀疏张量。CSC格式的稀疏张量乘法运算通常比 COO 格式的稀疏张量更快。 CSC格式&#xff08;Compressed Sparse Column Format&#xff09;是一种存储稀疏矩阵的常用格式&#xff0c;它通过三个数组来表示稀疏矩阵&#xff1a; 非零…