有什么理由使用运行时断言而不是编译时断言?

2024-03-18

在审查 Visual C++ 代码库时,我发现了以下奇怪的事情。运行时断言(即检查条件,如果违反条件则抛出异常) 用于可以在编译时评估条件的情况:

assert( sizeof( SomeType ) == sizeof( SomeOtherType ) );

显然,编译器将评估条件并替换有效的代码

assert( true );

不执行任何操作或

assert( false );

每次控制通过该行时都会引发异常。

IMO 应该使用编译时断言,原因如下:

  • 它会在编译时更早地暴露条件违规,并且
  • 它将让机器代码变得更干净(因此更快、更小)

看起来编译时断言是唯一正确的事情。这里是否有任何可能的理由更喜欢运行时断言?


这里没有理由更喜欢运行时断言。您应该更喜欢编译时错误而不是运行时错误,因此,考虑到两者之间的选项,永远没有理由选择运行时断言。

但是,如果静态断言不是一种选择(不知道静态断言的概念,不知道如何制作静态断言并且没有可用的静态断言,或者知道如何制作静态断言但没有)的时间),运行时断言是下一个最好的事情。

对于 C++0x,内置static_assert该功能应该结束在编译时断言可以工作的情况下使用运行时断言的所有理由。

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

有什么理由使用运行时断言而不是编译时断言? 的相关文章

  • WebBrowser Control 导致整个应用程序变得无响应

    我有一个带有嵌入式 Web 浏览器的 C NET 3 5 应用程序 浏览器被设计为指向远程站点 而不是本地站点 一切工作正常 但是当页面响应缓慢时 这会导致我的整个应用程序变得无响应 直到加载页面 我不介意浏览器在执行任务时没有响应 但应用
  • 通过指向基址的指针删除对象而不使用虚拟析构函数

    我有代码 class A1 public A1 cout lt lt A1 virtual A1 cout lt lt A1 class A2 public A2 cout lt lt A2 A2 cout lt lt A2 class B
  • C 语言的符号表

    我目前正在开发一种执行模式匹配的静态分析工具 我在用Flex https github com westes flex生成词法分析器 我编写了代码来管理符号表 我不太有经验C 所以我决定将符号表实现为线性链表 include
  • 如何将 int.TryParse 与可为空的 int 一起使用? [复制]

    这个问题在这里已经有答案了 我正在尝试使用 TryParse 来查找字符串值是否为整数 如果该值为整数 则跳过 foreach 循环 这是我的代码 string strValue 42 if int TryParse trim strVal
  • Swashbuckle 在 ASP.NET Core 中失败并出现 NotSupportedException 异常

    我跟着这个关于如何在我的 asp net core 2 2 项目中添加 swashbuckle 当我运行该项目时 我收到以下错误 处理请求时发生未处理的异常 NotSupportedException HTTP 方法 GET 和路径 id
  • 是否可以将 long long 返回值分配给 int64_t 而不会丢失 64 位机器中的精度?

    我已经实现了以下代码 include
  • 如何使用c#/VB.NET在word中插入书签

    我正在尝试使用 C 在 Word 文档中添加书签 但它不起作用 而且我在 msdn 文档和互联网上都找不到任何帮助 这就是我正在尝试做的事情 我正在阅读 Word 文档 然后在该文档中搜索关键字 然后将该文本转换为超链接 效果很好 现在 我
  • pybind11 返回 numpy 对象数组

    使用 pybind11 C API 和 python3 我们如何在 C 实现中正确创建一个 numpy 对象数组 即 unicode 字符串 并将其返回给 python 传递到 pybind11 array 的底层数据数组的确切内存布局是什
  • 如何使用 Unity 动态注册通用类?

    我有一个包含很多类 300 和 BaseClass 的程序集 我想用接口注册一个泛型类 统一后 您必须在 Name如果你想解析接口的对象数组 我想要一个对象数组主视图模型自动地 有没有办法通过反射来自动执行此操作 有什么建议么 示例 伪 p
  • 如何在提升日期时间中忽略周末和节假日?

    第一个问题 我有一个提升日期对象 如下所示 boost gregorian date 今天 2012 02 13 我从今天减去日期部分 如下所示 今天 月 240 或今天 天 X 等 我想在进行上述减法时是否有办法排除周末和特殊假期 我的意
  • 使用迭代器遍历 boost::ublas 矩阵

    我只是想从头到尾遍历一个矩阵 触及每个元素 然而 我发现升压矩阵没有一个迭代器 而是有两个迭代器 而且我无法弄清楚如何使它们工作以便您可以遍历整个矩阵 typedef boost numeric ublas matrix
  • 如何防止打印屏幕

    我有一个要求 我正在开发的应用程序阻止用户轻松捕获屏幕内容 我已经表示 没有可行的方法可以完全防止这种情况发生 但我正在寻找方法来为这一过程引入一些障碍 我正在使用 C NET 2 0 和 WinForms 你不能 您能做的最好的事情就是在
  • 在 C99 中,f()+g() 是未定义还是只是未指定?

    我曾经认为在C99中 即使函数的副作用f and g干扰 虽然表达f g 不包含序列点 f and g将包含一些 因此行为将是未指定的 要么 f 在 g 之前调用 要么 g 在 f 之前调用 我不再那么确定了 如果编译器内联函数会怎样 即使
  • 使用 C# 从文本中删除数字

    我有一个要处理的文本文件 其中有一些数字 我只想要其中的文字 而不是其他任何东西 我成功删除了标点符号 但是如何删除数字呢 我想要使 用 C 代码 另外 我想删除长度大于 10 的单词 如何使用 Reg 表达式来做到这一点 您可以使用正则表
  • if(pointerVar) 与 if(pointerVar!=NULL) 相同吗?

    简单的问题 Is if pointerVar 与if pointerVar NULL 也是if pointerVar 与if pointerVar NULL 给我你在技术上最正确 迂腐的答案 这两种说法看起来和操作起来都是一样的 前者有什么
  • 我们还需要迭代器设计模式吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Visual Studio 扩展找不到所需的程序集

    我为 Visual Studio 2013 编写了一个扩展 因为该死的组合框错误 https stackoverflow com questions 7800032 cancel combobox selection in wpf with
  • 使用循环在 C 中管道传输两个或多个 shell 命令

    我正在尝试执行ls wc l通过 C 语言程序 而不是使用命令行 这是我当前的工作代码 int main int pfds 2 pipe pfds pid t pid fork if pid 0 The child process clos
  • 是否可以在 ASP.NET Web API 和 SPA 中使用基于 cookie 的身份验证?

    我想创建基于 angularjs 前端和 ASP NET Web API 的 Web 应用程序 我需要创建安全 api 但我无法在将实施此 Web 应用程序的公司服务器上使用基于令牌的身份验证 是否可以对 SPA 和 ASP NET Web
  • 复杂对象上的 GroupBy(例如 List

    Using GroupBy and Count gt 1我试图在列表中查找我的类的重复实例 该类看起来像这样 public class SampleObject public string Id public IEnumerable

随机推荐

  • PIP:“无法卸载‘ipython’。它是一个已安装的 distutils 项目,因此我们无法准确确定......”[重复]

    这个问题在这里已经有答案了 正在尝试安装spyder https pypi org project spyder using pip pip install spyder 弹出这个错误 无法卸载 ipython 这是一个已安装的 distu
  • 标尺应用程序如何在所有设备上保持准确?

    我真的很困惑目前市场上的 iOS Ruler 应用程序如何与不同尺寸的设备兼容 底部显示了一个示例 经过研究 我得出的结论是 实时获取当前屏幕的 PPI 是不可能的 这使得无法以编程方式绘制尺子 我的疑问是这些标尺应用程序如何在无法获取设备
  • 关于在视频中查找学生

    我现在正在从事一个眼球追踪项目 在这个项目中 我在网络摄像头视频中跟踪眼睛 分辨率为 640X480 我可以在每一帧中定位和跟踪眼睛 但我需要定位瞳孔 我读了很多论文 大部分都是参考Alan Yuille的可变形模板方法来提取和跟踪眼睛特征
  • Spring + Oauth2:如何刷新访问令牌

    我正在使用 Spring Boot 构建 REST Web 服务 身份验证是使用 Spring Security 和 OAuth2 实现的 用户根据 LDAP 服务器进行身份验证 这是我的网络安全配置 Configuration Enabl
  • C# 开发最简单的免费设置

    我在上网本上使用 Windows XP SP3 我需要编译 C 程序以供学习 我没有快速的电脑或快速的互联网连接或快钱 有人可以建议让我继续前进的最佳方法吗 谢谢你们 http www microsoft com express Downl
  • 在 Android 3.1 上调整 TextView 大小不会缩小其高度

    我有一个TextView可以动态调整大小 我使用setTextSize 它在 Android 2 2 上正确扩展和收缩其边界 但在Android 3 1上 当文本变小时 区域的高度不会缩小 这证明了这一点 布局只是简单的垂直LinearLa
  • 背景和 CSS 浮动

    所以我使用 960 网格系统 发现了一些他们不支持的东西 我考虑过切换到蓝图 但我必须在此过程中稍后再回到设计 不管怎样 我简化了我的代码来展示我所经历的
  • 对数据库中的项目符号进行排序

    我有一个专栏 datatype varchar 50 在数据库 SQL Server 2008 中 其值如下所示 1 2 1 1 11 4 1 5 2 1 1 1 4 1 2 1 4 2 2 4 3 4 2 4 3 1 4 2 1 11 2
  • HTML 标题对齐问题

    你好 我有 2 个简单的标题 一个 h3 位于一个 h2 之上 由于某些奇怪的原因 h2 标题的左侧似乎有一个 1px 的间隙 这让我发疯 我只是不明白为什么会这样 h2 的字体大小为 40px 而 h3 的字体大小为 12px 有人能帮我
  • 使用 EPPlus 返回 INT 的 Excel 日期列

    所以我使用 EPPlus 来读取和写入 Excel 文档 Workflow 用户生成填充的 Excel 文档 打开文档并添加一行 已上传并已阅读 当我读回值时 使用 EPPlus 创建文档时生成的日期显示正确 但用户更改日期或添加的行显示为
  • 如何在样式文件中定义可绘制对象的大小?

    我想指定一次资源 值 styles xml两个复选框的大小及其四个形状可绘制对象 res drawable cb1 checked xml res drawable cb1 unchecked xml res drawable cb2 ch
  • 是什么原因导致“无可辩驳的模式失败了”,这是什么意思?

    什么是 无可辩驳的模式失败了 意思是 什么情况会导致这个运行时错误 考虑这个例子 foo Just x hello main putStrLn foo Nothing 这使用了一种无可辩驳的模式 部分 无可辩驳的模式总是 匹配 所以这个打印
  • Android TTS 音量控制

    向 TTS 引擎发送请求时 有什么方法可以控制 TTS 引擎的音量吗 我可以在这里使用 AudioManager 吗 谢谢 您可以在 TTS talk 方法中获取此信息 但只能从 API 级别 11 开始 为了保持向后兼容性 您可以定位更高
  • Java 通用列表>

    为什么在java中我们不能这样做 List
  • 使用 PHP 连接到 CMU Sphinx

    我一直在研究语音识别以及将其实施到网站中的方法 我发现了许多将其与 Python 一起使用的示例 甚至还有一个与 Node js 一起使用的示例 但我希望能够将 PHP 与此一起使用 有什么方法可以使用 PHP 访问 Linux 服务器上的
  • 如何在 Google Workspace 插件中国际化 universalActions 标签

    我设置了一个 Gmail 插件universalActions菜单 标签应由以下方式定义Session getActiveUserLocale 以任何方式 由于清单文件中不允许使用变量 appscript json 我不知道该怎么做 我正在
  • 无法在 VS 2017 15.5.7 中添加服务引用

    我有一个 VB NET Core 应用程序 我正在尝试连接到远程 WCF 服务 当我尝试通过 添加连接服务 常规情况下 未列出任何服务 并显示一条消息 当前项目类型不支持任何连接服务 我尝试安装 WCF Web 服务参考提供程序扩展 IIU
  • 如何在android中通过特定应用程序分别查找wifi和网络数据使用情况?

    recived TrafficStats getUidRxBytes uid send TrafficStats getUidTxBytes uid TrafficStats getMobileRxBytes TrafficStats ge
  • Leaflet maxBounds - 边界不起作用

    我尝试了 Leafletjs maxBounds我在 Mapbox 找到的示例代码 https www mapbox com mapbox js example v1 0 0 maxbounds 下面你可以找到我的完整代码 也在jsfidd
  • 有什么理由使用运行时断言而不是编译时断言?

    在审查 Visual C 代码库时 我发现了以下奇怪的事情 运行时断言 即检查条件 如果违反条件则抛出异常 用于可以在编译时评估条件的情况 assert sizeof SomeType sizeof SomeOtherType 显然 编译器