在 C++14 / C++11 中隐藏 中的 isnan?

2024-01-15

我这里有一个小型测试应用程序,它使用isnan from <math.h>:

#include <iostream>
#include <math.h>

int main()
{
    double d = NAN;

    std::cout << isnan(d) << '\n';

    return 0;
}

根据 3 种不同的标准构建和运行:

$ g++ -std=c++98 main.cpp; ./a.out
1

$ g++ -std=c++11 main.cpp; ./a.out
1

$ g++ -std=c++14 main.cpp; ./a.out
1

现在我们还包括<cmath>,并用两者进行测试isnan and std::isnan:

#include <iostream>
#include <cmath>
#include <math.h>

int main()
{
    double d = NAN;

    std::cout << std::isnan(d) << '\n';
    std::cout << isnan(d) << '\n';

    return 0;
}

构建并运行:

C++98 工作

$ g++ -std=c++98 main.cpp; ./a.out
1
1

C++11 和 C++14 没有,isnan没有找到。

$ g++ -std=c++11 main.cpp
main.cpp: In function ‘int main()’:
main.cpp:10:25: error: ‘isnan’ was not declared in this scope
     std::cout << isnan(d) << '\n';
                         ^
main.cpp:10:25: note: suggested alternative:
In file included from main.cpp:3:0:
/usr/include/c++/5/cmath:641:5: note:   ‘std::isnan’
     isnan(_Tp __x)
     ^

$ g++ -std=c++14 main.cpp
main.cpp: In function ‘int main()’:
main.cpp:10:25: error: ‘isnan’ was not declared in this scope
     std::cout << isnan(d) << '\n';
                         ^
main.cpp:10:25: note: suggested alternative:
In file included from main.cpp:3:0:
/usr/include/c++/5/cmath:641:5: note:   ‘std::isnan’
     isnan(_Tp __x)
     ^

请注意,包含的顺序并不重要。如果我包括<cmath> before <math.h>或者之后,结果是一样的。

问题

  • Why is isnan gone?
  • 无需返回并更改旧代码即可在新标准下进行编译,有什么方法可以解决此问题吗?

简单总结一下相关要点,主要来自乔纳森·韦克利 (Jonathan Wakely) 的精彩博客文章 http://developers.redhat.com/blog/2016/02/29/why-cstdlib-is-more-complicated-than-you-might-think/:

  • glibc math.h声明过时的 X/Openint isnan(double);与 C99/C++11 版本不兼容(bool isnan(double);).
  • glibc 2.23 的math.h通过不声明来解决这个问题isnanC++11 或更高版本中的函数。
  • 他们都仍然定义了一个isnan macro. #include <cmath>按照 C++ 标准的要求对该宏进行核武器攻击。
  • GCC 6的libstdc++提供了自己特殊的math.h声明一个标头bool isnan(double);在全局命名空间中(除非 libcmath.h声明过时的签名),并且还按照标准的要求删除宏。
  • 在海湾合作委员会 6 之前,#include <math.h>只是包含了 libc 中的标头,因此宏不会被破坏。
  • #include <cmath>总是对宏进行核攻击。

最终结果,在 C++11 模式下:

glibc <  2.23, GCC <  6: <math.h> uses the macro; <cmath> uses obsolete signature
glibc >= 2.23, GCC <  6: <math.h> uses the macro; <cmath> results in error
glibc <  2.23, GCC >= 6: <math.h> and <cmath> use obsolete signature
glibc >= 2.23, GCC >= 6: <math.h> and <cmath> use standard signature
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C++14 / C++11 中隐藏 中的 isnan? 的相关文章

  • 将类对象放置在向量中?

    我注意到我可以将一个类放置在一个向量中 这是我的程序 我收到以下错误 out blackjack exe blackjack obj blackjack obj error LNK2019 unresolved external symbo
  • 转换 const void*

    我有一个函数返回一个const void 我想用它的信息作为char 我可以将它投射为 C 风格的罚款 char variable但是当我尝试使用reinterpret cast like reinterpret cast
  • 前向声明类型和“已声明为类类型的非类类型”

    我对以下代码有问题 template
  • 当事件button.click发生时,如何获取按钮名称/标签?

    我以编程方式制作按钮并将它们添加到堆栈面板中 以便每次用户导航到页面时按钮都会发生变化 我正在尝试做这样的事情 当我单击创建的按钮时 它将获取按钮的标签并转到正确的页面 但是 我无法使用 RoutedEventHandler 访问按钮元素
  • extern 声明和函数定义都在同一文件中

    我只是浏览了一下gcc源文件 在gcc c 我发现了类似的东西 extern int main int char int main int argc char argv 现在我的疑问是extern是告诉编译器特定的函数不在这个文件中 但可以
  • 如何将 .txt 文件中的数据转换为 xml? C#

    我在一个文本文件中有数千行数据 我想通过将其转换为更容易搜索的内容来轻松搜索 我希望 XML 或其他类型的大型数据结构 尽管我不确定它是否是最好的对于我的想法 每行的数据如下所示 第 31 册 托马斯 乔治 32 34 154 每本书都不是
  • 语音识别编程问题入门

    所以 你们可能都看过 钢铁侠 其中托尼与一个名为贾维斯的人工智能系统进行交互 演示剪辑here http www youtube com watch v Go8zsh1Ev6Y 抱歉 这是广告 我非常熟悉 C C 和 Visual Basi
  • 如何使用 Regex.Replace 从字符串中删除数字?

    我需要使用Regex Replace从字符串中删除所有数字和符号 输入示例 123 abcd33输出示例 abcd 请尝试以下操作 var output Regex Replace input d string Empty The d标识符
  • 什么是空终止字符串?

    它与什么不同标准 字符串 http www cplusplus com reference string string 字符串 实际上只是一个数组chars 空终止字符串是指其中包含空字符的字符串 0 标记字符串的结尾 不一定是数组的结尾
  • C++中判断unicode字符是全角还是半角

    我正在编写一个终端 控制台 应用程序 该应用程序应该包装任意 unicode 文本 终端通常使用等宽 固定宽度 字体 因此要换行文本 只需计算字符数并观察单词是否适合一行并采取相应的操作 问题是 Unicode 表中的全角字符在终端中占用了
  • 如何递归取消引用指针(C++03)?

    我正在尝试在 C 中递归地取消引用指针 如果传递一个对象 那就是not一个指针 这包括智能指针 我只想返回对象本身 如果可能的话通过引用返回 我有这个代码 template
  • 将 Word 转换为 PDF - 禁用“保存”对话框

    我有一个用 C 编写的 Word 到 PDF 转换器 除了一件事之外 它工作得很好 有时 在某些 Word 文件上 后台会出现一条消息保存源文件中的更改 gt 是 否 取消 但我没有对源文件进行任何更改 我只想从 Word 文件创建 PDF
  • 模板类中的无效数据类型生成编译时错误?

    我正在使用 C 创建一个字符串类 我希望该类仅接受数据类型 char 和 wchar t 并且我希望编译器在编译时使用 error 捕获任何无效数据类型 我不喜欢使用assert 我怎样才能做到这一点 您可以使用静态断言 促进提供一个 ht
  • 将 Lambda 表达式树与 IEnumerable 结合使用

    我一直在尝试了解有关使用 Lamba 表达式树的更多信息 因此我创建了一个简单的示例 这是代码 如果作为 C 程序粘贴到 LINQPad 中 它可以工作 void Main IEnumerable
  • 代码中的.net Access Forms身份验证“超时”值

    我正在向我的应用程序添加注销过期警报 并希望从我的代码访问我的 web config 表单身份验证 超时 值 我有什么办法可以做到这一点吗 我认为您可以从 FormsAuthentication 静态类方法中读取它 这比直接读取 web c
  • 在 Win32 控制台应用程序中设置光标位置

    如何在 Win32 控制台应用程序中设置光标位置 最好 我想避免制作句柄并使用 Windows 控制台功能 我花了整个早上沿着那条黑暗的小巷跑 它产生的问题比它解决的问题还要多 我似乎记得当我在大学时使用 stdio 做这件事相对简单 但我
  • EntityFramework 6.0.0.0 读取数据,但不插入

    我创建了一个基于服务的数据库 folderName gt Add New Item gt Data gt Service based Database文件到 WPF 应用程序中 然后我用过Database First方法并创建了Person
  • 在 System.Type 上使用条件断点时出错

    这是函数 public void Init System Type Type this Type Type BuildFieldAttributes BuildDataColumns FieldAttributes 我在第一行设置了一个断点
  • 当用户更改 Windows 中的语言键盘布局时如何通知?

    I want to show a message to user when the user changes the language keyboard layout of Windows for example from EN to FR
  • 如何在 C 中将 char 连接到 char* ?

    我怎样才能前置char c to char myChar 我有c值为 A and myChar值为 LL 我怎样才能前置c to myChar使 ALL 这应该有效 include

随机推荐

  • 如何使用所有模型的通用 Trait 在 Laravel 中实现 eloquent 事件

    我在用拉拉维尔 5 4创建一个网络应用程序 我创建了一个特征来实现创建 更新 删除和恢复雄辩事件的事件 我创建了一个trait如下
  • 如何使用 AngularJS 更改一个 div 上的类,同时将鼠标悬停在另一个 div 上?

    我想使用 AngularJS 指令更改一个 div 的类 同时将鼠标悬停在另一个 div 上 这是我到目前为止所拥有的http jsfiddle net E8nM5 38 http jsfiddle net E8nM5 38 HMTL di
  • 当indexedDB被阻止时应用程序应该如何反应

    我在另一个地方被告知question https stackoverflow com questions 39997018关于检测阻止和解除阻止事件 阻止的打开 或删除 不会被取消 只是 被阻止 一旦解除阻止 打开 或删除 将继续 我想知道
  • Wcf 基本身份验证

    通过简单的测试 Wcf 服务使用基本身份验证时遇到一些问题 我遇到了一个例外 无法激活请求的服务 http qld tgower test Service svc 有关详细信息 请参阅 gt 服务器的诊断跟踪日志 在跟踪日志中它显示 在主机
  • WPF DataGrid实际ColumnHeaderHeight

    当我将 WPF DataGrid 的 ColumnHeaderHeight 设置为 Auto double NaN 时 如何获取列标题的实际呈现高度 我似乎无法在 DataGrid 类中找到该属性 您可以通过在视觉树中搜索来获取它DataG
  • 按照教程 AWS Elastic Beanstalk 的 Flask 教程时出现错误“Your requests.txt is invalid”

    我正在关注 AWS Elastic Beanstalk 的烧瓶教程 http docs aws amazon com elasticbeanstalk latest dg create deploy python flask html部署示
  • 用于确定测试成绩通过/失败的 MIPS 程序

    我正在编写一个 MiPS 程序 该程序将检查 15 个测试分数的列表 它将从终端输入 通过标准是 50 分 终端的输出将包括每个类别的分数以及通过和失败的学生人数 我应该使用输入提示和输出语句 请我需要一些帮助 只需要一些建议如何去做 ma
  • 禁用 GridView 列调整大小

    有什么方法可以在 WPF 中禁用 GridViewColumn 调整大小吗 我不想设置控件的样式 请参阅此链接 ListView 中的固定宽度列 无法调整大小的列 http blogs msdn com b atc avalon team
  • Spark 如何向工作线程发送闭包?

    当我编写 RDD 转换时 例如 val rdd sc parallelise 1 to 1000 rdd map x gt x 3 据我了解 关闭 x gt x 3 这只是一个 Function1 需要可序列化 并且我想我在某处读过编辑 它
  • 有没有办法在 CSS 中查询具有多个类的元素?

    如何查询同时具有两个类的元素 例如 div span class major minor Test span div 我想对同时具有 主要 和 次要 类的所有跨度进行样式设置 以下应该可以解决问题 span major minor colo
  • 添加黑条以创建 16x9 图像

    我的服务器上有一张jpg 我用 imagecreatefromjpeg imgPath 打开它 我想通过在顶部 底部或左侧 右侧添加黑条来使其成为 16x9 图像 思考background size contain background p
  • 使用 pandoc 从 Markdown 转换为 PDF 时设置双倍间距和行号

    我正在使用 markdown 和 pandoc 进行科学写作 我知道我可以使用以下命令更改最终 pdf 的边距 使用 pandoc 从 Markdown 转换为 PDF 时设置边距大小 https stackoverflow com que
  • Jackson @ResponseBody 上的内部服务器错误

    我只想将我的用户对象作为 JSON 返回 以供客户端的 ajax 调用使用 这在某一时刻是有效的 经过一些更新 即 将应用程序更改为部署到 在 Jetty 中 后 现在就不行了 我没有从代码中抛出异常 它返回得很好 但在尝试将对象转换为 J
  • 如何使用 Rxjs 实现队列?

    有了 Promise 就可以很容易地实现一个队列来防止多个 HTTP 请求并行运行 class Runner private promise constructor http this promise q resolve getUrl re
  • QtCreator 中使用 Clang 支持 C++14

    如何使用 Clang 3 5 在 QtCreator 3 3 中启用 C 14 支持 我添加了一个 Clang 套件并且添加了CONFIG c 14在我的项目文件中 然而 当使用例如返回类型推导 https stackoverflow co
  • 如何将多个函数应用于 groupby 对象

    例如 我有两个 lambda 函数可应用于分组数据框 df groupby A B apply lambda g df groupby A B apply lambda g 两者都可以工作 但组合起来就不行了 df groupby A B
  • 在 Tkinter 主循环期间录制 OpenCV 视频

    我正在开发一项心理学实验 分析用户在完成行为任务时所做的面部表情 该应用程序主要通过 Tkinter 运行 我使用 openCV 来捕获视频 在最小的情况下 我需要根据用户响应开始和停止录制 例如 在下面的代码中 我希望用户使用鼠标按下按钮
  • 当 pthread_attr_t 不为 NULL 时?

    POSIX 线程中 pthread create 的所有参数都非常容易理解 除了线程属性 什么是线程属性不应该被初始化的原因 方式和时间NULL 我经历了Linuxman page http man7 org linux man pages
  • 使用 codeigniter 发送简单的电子邮件

    我正在尝试使用 codeigniter 发送简单的电子邮件 如解释此链接所示Codeigniter 电子邮件类 https www codeigniter com user guide libraries email html 但它不起作用
  • 在 C++14 / C++11 中隐藏 中的 isnan?

    我这里有一个小型测试应用程序 它使用isnan from