这取决于您包含哪个标题。如果您包含 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 部分冲突,虽然从未尝试过)。