gpt4 book ai didi

c++ - 对 abs(double) 的模棱两可的重载调用

转载 作者:IT老高 更新时间:2023-10-28 13:23:37 28 4
gpt4 key购买 nike

我有以下 C++ 代码:

#include <math.h>
#include <cmath.h> // per http://www.cplusplus.com/reference/clibrary/cmath/abs/

// snip ...

if ( (loan_balance < 0) && (abs(loan_balance) > loan_payment) ) {
...
}

make 爆炸:

error: call of overloaded 'abs(double)' is ambiguous

也很感兴趣:

/usr/include/stdlib.h:785: note: candidates are: int abs(int)

如何指定编译器需要调用 cmath.h 中可以处理 float 的 abs()?

编译器信息(不确定这是否重要):

[some_man@some_box ~/some_code]#  gcc -v
Using built-in specs.
Target: i386-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr /share/info --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-libgcj-multifile --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --enable-plugin --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre --with-cpu=generic --host=i386-redhat-linux
Thread model: posix
gcc version 4.1.2 20080704 (Red Hat 4.1.2-44)

最佳答案

标题 <math.h>是一个 C 标准库头文件。它在全局命名空间中定义了很多东西。 header <cmath>是该 header 的 C++ 版本。它在命名空间 std 中定义了基本相同的东西. (有一些区别,比如 C++ 版本带有一些函数的重载,但这没关系。)标题 <cmath.h>不存在。

由于供应商不想维护本质上相同的 header 的两个版本,因此他们想出了不同的可能性,即只在幕后使用其中一个。通常,这是 C 头文件(因为 C++ 编译器能够解析它,而相反的则不起作用),而 C++ 头文件只包含它并将所有内容拉入命名空间 std .或者有一些宏魔术来解析有或没有 namespace std 的相同标题。是否缠绕它。除此之外,在某些环境中,如果 header 没有文件扩展名(例如编辑器无法突出显示代码等),这会很尴尬。所以一些供应商会有<cmath>是一个单行,包括一些其他带有 .h 的标题扩大。或者有些人会映射所有包含匹配的<cblah><blah.h> (通过宏魔术,在定义 __cplusplus 时成为 C++ 头文件,否则成为 C 头文件)或 <cblah.h>管他呢。

这就是为什么在某些平台上(包括 <cmath.h>)的原因,它不应该存在,最初会成功,尽管它可能会使编译器在以后失败。

我不知道你使用哪个标准库实现。我想它是 GCC 附带的,但我不知道,所以我无法准确解释你的情况发生了什么。但这肯定是上述供应商特定黑客之一的混合,并且您包含了一个您不应该包含自己的标题。也许是<cmath>映射到 <cmath.h>使用您尚未定义的特定(一组)宏,因此您最终得到了两个定义。

但是请注意,这段代码仍然不应该编译:

#include <cmath>

double f(double d)
{
return abs(d);
}

不应该有 abs()在全局命名空间中(它是 std::abs() )。但是,根据上述实现技巧,很可能会有。稍后移植此类代码(或者只是尝试使用您的供应商不允许这样做的下一个版本对其进行编译)可能会非常乏味,因此您应该注意这一点。

关于c++ - 对 abs(double) 的模棱两可的重载调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1374037/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com