ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – std :: namespace中的isnan是什么?更一般地说,什么时候std ::必要,可选或者要避免?

2019-10-05 06:16:43  阅读:685  来源: 互联网

标签:c98 c portability mingw


使用Mingw 4.7.2,我有一个因为调用isnan而无法编译的库.
如果我使用std :: isnan,编译器会说“一切都会好的”,而且我确实设法编译了我的文件.

但是,如果我检查here(编辑:但也许我应该检查here :-)),std ::似乎没有必要.如果我添加它,该文件是否可移植?

更一般地说,对于每种情况都有一般的方法来理解何时将std ::放入(可移植性),可选或要避免?

编辑

实际上,问题的根源在于存在多个头部包含,并且一些包含的头部包括< cmath>,而该cpp文件试图包括< math.h> (当已经包括< cmath>时).

解决方法:

这取决于您包含的标头.如果包含C头< math.h> (它是C的一部分,虽然标记为已弃用),然后您可以使用非限定C函数,如isnan.另一方面,如果您包含C标头< cmath>,则只能保证它带来< math.h>中的所有函数.进入std命名空间,因此你必须正确地限定它们,比如std :: isnan(或者使用某种using指令).遗憾的是,当包含< cmath>时,允许实现但不需要将这些函数带入全局命名空间. (因此它是众多“我机器上的作品”之一 – C的重要性以及许多人编写代码的原因,就像你刚刚尝试编译失败一样).

总结一下:要么包括< math.h>并使用isnan或包括< cmath>并使用std :: isnan,其他一切都是不可移植的.当然,所有这些都适用于任何其他C头及其各自的C版本.

编辑:应该注意的是,这个特殊的函数isnan仅在C 11之后得到支持,并且在C 98中根本不可用(这可能是你混淆的一部分).但是在这种情况下这并没有改变任何东西,因为在C 98中既没有< cmath>也不是< math.h> (这是当时的实际C89 / C90标题而不是C 11包含的C99标题)具有此功能,因为它们始终处于同步状态.那么你的问题中的这个库可能尝试使用C 98,同时从不同的C99实现中获取isnan函数(这不是一个特别好的主意,因为它可能与C实现的C89 / C90部分冲突,从不甚至试过这个).

标签:c98,c,portability,mingw
来源: https://codeday.me/bug/20191005/1855404.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有