Ant*_*nio 10 c++ portability mingw c++98
使用Mingw 4.7.2,我有一个因为调用而无法编译的库isnan.如果我使用std::isnan,编译器会说"一切都会好的" ,而且我确实设法编译了我的文件.
但如果我在这里查看(编辑:但也许我也应该在这里检查:-)),std::似乎没有必要.如果我添加它,该文件是否可移植?
更一般地说,对于每种情况,有一般的方法来理解何时std::需要(可移植性),可选或要避免?
编辑
实际上,问题的根源是有多个头部包含,并且包含的一些头部包括<cmath>,而这个cpp文件试图包含<math.h>(当<cmath>已经包含时).
Chr*_*ica 15
这取决于您包含的标头.如果你包含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,同时isnan从不同的C99实现中获取函数(这不是一个特别好的主意,因为它可能与C++实现的C89/C90部分冲突,从来没有尝试过这个).
C没有命名空间的概念.当您编写#include <math.h>标题中声明的所有名称时,请转到全局命名空间,然后您需要编写isnan.
C++有名称空间.仍然,当您编写#include <math.h>标题中声明的所有名称进入全局命名空间时,您需要编写isnan,就像在C中一样.
另外,当你编写#include <cmath>标题中声明的所有名称进入命名空间时std,你需要编写std::isnan.
此外,C++实现都允许也去其他的方式,#include <math.h>把名字变成std 以及在全局命名空间,并与#include <cmath>把名字到全局命名空间,以及中std.不要依赖于此; 这样做的代码不可移植.这是对实现者的一种让步,使事情变得更容易; 它真正的意思是,如果你使用#include <cmath>,你不能假设不会有isnan全局命名空间,而且如果你用#include <math.h>你不能假设不会有isnan在std.