如何在 MSVC 下检测 C++11 的 noexcept 功能?

2024-01-17

我正在使用 C++ 库。该库的最低要求是 C++03。我在 Visual Studio 2015 下收到一些关于抛出析构函数的警告:

... algparam.h(271): warning C4297: 'AlgorithmParametersBase::~AlgorithmParametersBase':
    function assumed not to throw an exception but does
... algparam.h(271): note: destructor or deallocator has
    a (possibly implicit) non-throwing exception specification

这个投掷是在 20 世纪 90 年代编写代码时设计的,但现在已经显得过时了。目前我们有点陷入困境,因为我们还没有准备好迎接主要版本的更新。 (而且它并不像听起来那么糟糕初级筋膜因为它根据uncaught_exception http://en.cppreference.com/w/cpp/error/uncaught_exception).

我想通过检测 C++ 11 来修复该问题,然后添加noexcept(false) http://en.cppreference.com/w/cpp/language/noexcept。我打算将其隐藏在宏中,以便代码可以在 C++03 和 C++11 下编译。

下面的做法是not可以在 Visual Studio 2015 下检测 C++11。它不会产生预期的编译器错误:

#if (__cpluplus >= 201103L)
# error Not C++11
#endif

此外,微软还not似乎提供了预定义宏 https://msdn.microsoft.com/en-us/library/b0084kay.aspx用于检测语言特征。

如何在 Visual Studio 2015 下检测 C++11?


相关,我可以通过检测MSVC编译器的版本_MSC_VER https://msdn.microsoft.com/en-us/library/b0084kay.aspx. I think这将是_MSC_VER=1900对于VS2015。但它没有告诉我任何有关语言特征的信息。

如果用户使用 VS2015,但使用较低级别的 C++ 标准,则语言功能非常重要。另外,我没有 VS2013 来测试,所以我不确定像这样的 1-off 字符串_MSC_VER=1700是个好主意。我更愿意了解它是否是 C++11。


我在使用 Clang 和 GCC 编译器的 OS X 和 Linux 上遇到了类似的问题。例如,参见如何保护 C++03 和 C++11 的移动构造函数? https://stackoverflow.com/q/30797388/608639 and 在运行时可以检测到 C++03 和 C++11 之间的哪些差异(如果有)? https://stackoverflow.com/q/6473218但在这种情况下,我想通过预处理器检测它。


最后,这个库不使用 Autotools、Cmake 或 Boost。它没有外部依赖性。


您无法独立于 VS 版本来检测语言版本,因为 VS 不提供语言版本控制开关 - 不存在 VS2015 C++03 模式之类的东西。您尝试检测的条件(VS2015 的下级标准)不存在,这很容易解释为什么没有功能宏来检测它。

只需检测 VS 版本并将其关闭即可。

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

如何在 MSVC 下检测 C++11 的 noexcept 功能? 的相关文章

  • 是否可以强制 XMLWriter 将元素写入单引号中?

    这是我的代码 var ptFirstName tboxFirstName Text writer WriteAttributeString first ptFirstName 请注意 即使我使用 ptFirstName 也会以双引号结束 p
  • 当我使用“control-c”关闭发送对等方的套接字时,为什么接收对等方的套接字不断接收“”

    我是套接字编程的新手 我知道使用 control c 关闭套接字是一个坏习惯 但是为什么在我使用 control c 关闭发送进程后 接收方上的套接字不断接收 在 control c 退出进程后 发送方的套接字不应该关闭吗 谢谢 我知道使用
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • 将数组向左或向右旋转一定数量的位置,复杂度为 o(n)

    我想编写一个程序 根据用户的输入 正 gt 负 include
  • pthread_cond_timedwait() 和 pthread_cond_broadcast() 解释

    因此 我在堆栈溢出和其他资源上进行了大量搜索 但我无法理解有关上述函数的一些内容 具体来说 1 当pthread cond timedwait 因为定时器值用完而返回时 它如何自动重新获取互斥锁 互斥锁可能被锁定在其他地方 例如 在生产者
  • 如何忽略“有符号和无符号整数表达式之间的比较”?

    谁能告诉我必须使用哪个标志才能使 gcc 忽略 有符号和无符号整数表达式之间的比较 警告消息 gcc Wno sign compare 但你确实应该修复它警告你的比较
  • 获取没有非标准端口的原始 url (C#)

    第一个问题 环境 MVC C AppHarbor Problem 我正在调用 openid 提供商 并根据域生成绝对回调 url 在我的本地机器上 如果我点击的话 效果很好http localhost 12345 login Request
  • C#:如何防止主窗体过早显示

    在我的 main 方法中 我像往常一样启动主窗体 Application EnableVisualStyles Application SetCompatibleTextRenderingDefault false Application
  • 指针减法混乱

    当我们从另一个指针中减去一个指针时 差值不等于它们相距多少字节 而是等于它们相距多少个整数 如果指向整数 为什么这样 这个想法是你指向内存块 06 07 08 09 10 11 mem 18 24 17 53 7 14 data 如果你有i
  • 使用 System.Text.Json 即时格式化 JSON 流

    我有一个未缩进的 Json 字符串 例如 hash 123 id 456 我想缩进字符串并将其序列化为 JSON 文件 天真地 我可以使用缩进字符串Newtonsoft如下 using Newtonsoft Json Linq JToken
  • 如何返回 json 结果并将 unicode 字符转义为 \u1234

    我正在实现一个返回 json 结果的方法 例如 public JsonResult MethodName Guid key var result ApiHelper GetData key Data is stored in db as v
  • 在 ASP.NET Core 3.1 中使用包含“System.Web.HttpContext”的旧项目

    我们有一些用 Net Framework编写的遗留项目 应该由由ASP NET Core3 1编写的API项目使用 问题是这些遗留项目正在使用 System Web HttpContext 您知道它不再存在于 net core 中 现在我们
  • 从库中捕获主线程 SynchronizationContext 或 Dispatcher

    我有一个 C 库 希望能够将工作发送 发布到 主 ui 线程 如果存在 该库可供以下人员使用 一个winforms应用程序 本机应用程序 带 UI 控制台应用程序 没有 UI 在库中 我想在初始化期间捕获一些东西 Synchronizati
  • 需要哪个版本的 Visual C++ 运行时库?

    microsoft 的最新 vcredist 2010 版 是否包含以前的版本 2008 SP1 和 2005 SP1 还是我需要安装全部 3 个版本 谢谢 你需要所有这些
  • WCF:将随机数添加到 UsernameToken

    我正在尝试连接到用 Java 编写的 Web 服务 但有些东西我无法弄清楚 使用 WCF 和 customBinding 几乎一切似乎都很好 除了 SOAP 消息的一部分 因为它缺少 Nonce 和 Created 部分节点 显然我错过了一
  • C - 直接从键盘缓冲区读取

    这是C语言中的一个问题 如何直接读取键盘缓冲区中的数据 我想直接访问数据并将其存储在变量中 变量应该是什么数据类型 我需要它用于我们研究所目前正在开发的操作系统 它被称为 ICS OS 我不太清楚具体细节 它在 x86 32 位机器上运行
  • 为什么 C# Math.Ceiling 向下舍入?

    我今天过得很艰难 但有些事情不太对劲 在我的 C 代码中 我有这样的内容 Math Ceiling decimal this TotalRecordCount this PageSize Where int TotalRecordCount
  • Process.Start 阻塞

    我正在调用 Process Start 但它会阻止当前线程 pInfo new ProcessStartInfo C Windows notepad exe Start process mProcess new Process mProce
  • C 中的异或运算符

    在进行按位操作时 我在确定何时使用 XOR 运算符时遇到一些困难 按位与和或非常简单 当您想要屏蔽位时 请使用按位 AND 常见用例是 IP 寻址和子网掩码 当您想要打开位时 请使用包含或 然而 XOR 总是让我明白 我觉得如果在面试中被问
  • 防止索引超出范围错误

    我想编写对某些条件的检查 而不必使用 try catch 并且我想避免出现 Index Out of Range 错误的可能性 if array Element 0 Object Length gt 0 array Element 1 Ob

随机推荐

  • NSURLConnection 在 401 状态下重试

    我正在与服务器通信 该服务器验证密码并返回无效密码的 401 错误 以及指定失败尝试次数的 json 正文 每次验证失败时 服务器都会增加该数字 我面临的问题是 当 NSURLConnection 收到 401 响应时 它会启动涉及这些委托
  • 在使用 IE 8 的 Windows 7 上运行 WatiN 时遇到问题

    当我在带有 IE8 的 Windows 7 上运行任何 WatiN 测试时 请注意 所有测试都在带有 IE8 的 Vista 上通过 浏览器显示第一页 但不再继续 几秒后出现以下异常 WatiN Core Exceptions Timeou
  • 在纯 JavaScript 中加载多个 JSON 文件

    我是 JavaScript 新手 我已经了解如何使用 JSON Parse 从 JSON 文件创建对象 现在我需要将多个本地 JSON 加载到数组中 我已经在谷歌上搜索我的问题一段时间了 但我发现的所有内容都与单个 JSON 文件相关 有没
  • 用于 CSV 的基于 Spring Batch Java 的 FileItemWriter

    我有一个包含 ItemWriter 的 Spring Batch 服务 用于将数据写入 CSV 我使用了 Spring Batch 指南给出的示例 https spring io guides gs batch processing htt
  • 在 JavaScript 中将项目推入多维树状结构

    我有一系列对象 它们的情况如下 var obj id 23 name Test1 children id 24 name Test2 children id 25 name Test2 children 每个孩子可以有多个子孩子 所以基本上
  • 如何使用 HEAD 和任何合并工具解决所有冲突

    因此 由于某种原因 我与新的合并修补程序发生了很多冲突 实际 手动 更改的文件没有冲突 所有冲突都在修复过程中未触及的文件中 显然是空格问题 稍后我会尝试解决该问题 但现在我需要合并修补程序并进行部署 如何解决所有冲突以使用 HEAD 版本
  • 在 64 位操作系统中使用 glMultiDrawElements

    我最近从32位环境迁移到64位环境 除了一个问题之外 一切都很顺利 glMultiDrawElements使用一些在 64 位操作系统下不进行一些调整就无法工作的数组 glMultiDrawElements GL LINE LOOP fCo
  • Vavr 对象的序列化器/反序列化器

    您好 我正在尝试将 vavr 添加到我的项目中 现在我正在努力解决 Vavr List 对象的正确序列化问题 下面是我的控制器 import io vavr collection List GetMapping value xxx publ
  • 具有 varchar id 的 Doctrine2 实体不会将 id 插入数据库

    我正在尝试在 ZF2 应用程序中为 Doctrine2 创建实体 我的实体应该有 id varchar 15 但是当我尝试创建新行时 doctrine2 不会将此 ID 推送到数据库中 在实体生成的类中我有这个 Checkpoints OR
  • React - 模块解析失败

    从命令行运行 webpack 时 我一整天都遇到此错误 ERROR in index js Module parse failed home kuro Workspace ExpressJS corate src index js Line
  • Angular.JS:为什么无法编辑输入?

    这是一个奇怪的问题 代码很简单 HTML 代码 ul ul
  • 如果内容超过一定限制,PHP 电子邮件会中断

    我正在使用 PHPmail 发送每日通知电子邮件 但我注意到 如果存储邮件内容的字符串太长 则电子邮件会被中断 即收到的电子邮件中只会显示部分内容 当内容字符串很短时 电子邮件将是完整的 看来 PHP 对字符串的长度有一些限制 我尝试使用e
  • 如何在单击时将按钮图像从打开切换到关闭,反之亦然?

    我一直在尝试通过添加打开状态的图像和添加关闭状态的图像来将按钮的状态从打开切换到关闭 反之亦然 我尝试通过 xml 但是我只能在单击时临时切换它 通过使用按下 焦点等 这是相同的代码 片段 贾斯汀
  • Emacs:仅在迷你缓冲区中禁用行截断

    我在用IDO模式 http www emacswiki org emacs InteractivelyDoThings用于 Emacs 23 中的文件和缓冲区切换 如果目录中有超过一行的文件 以下选项允许调整迷你缓冲区的大小 setq re
  • Windows 中的自签名证书无需 makecert?

    我们有一个收缩包装类型的 Windows 服务器应用程序 我们需要在服务器上创建一个自签名证书以供某些 WCF Web 服务使用 从我们在网络上的搜索来看 Microsoft PlatformSDK 中的 makecert 实用程序似乎无法
  • Python 类中的公共变量?

    我现在正在自学 Python 课程 并发现了这个页面 http www tutorialspoint com python python classes objects htm http www tutorialspoint com pyt
  • Flutter:如何获取 Firestore 中集合的所有文档名称

    我使用 Firestore 在 Flutter 中制作了一个应用程序 现在我将浏览集合中的所有文档 我想获取文档名称 id 和文档字段 并对其执行某些操作 我已经制作了一个显示数据的列表视图 但我无法用它做一些事情 例如 将其添加到列表或其
  • 多线程应用程序执行 onclickBtn 后挂起

    我正在 javaFx 中编写一个天气应用程序 从 openweather org 获取数据 从 openweather 获取 JSON 的整个代码工作正常 也将 JSON 数据转换为对象 我使用lambda表达式来实现Runnable in
  • Python 习语与多次调用 os.path.dirname 获得相同的结果?

    我发现自己需要在源树中获取 python 文件的父目录 该源树是具有一定规律性的多个目录 必须多次调用 dirname 很笨拙 我环顾四周 很惊讶没有找到关于此的帖子 一般场景是 import os path as op third deg
  • 如何在 MSVC 下检测 C++11 的 noexcept 功能?

    我正在使用 C 库 该库的最低要求是 C 03 我在 Visual Studio 2015 下收到一些关于抛出析构函数的警告 algparam h 271 warning C4297 AlgorithmParametersBase Algo