使用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部分冲突,从不甚至试过这个).