我有以下的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可以处理花车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标准库头。 它定义在全局命名空间的东西很多。 头<cmath>
是C ++版本标头的。 它本质上定义的命名空间中的同样的东西std
。 (有一些差异,比如,在C ++版本带有某些功能的过载,但是这并不重要。)的报头<cmath.h>
不存在。
由于供应商不希望保持的本质上是相同的头两个版本,他们想出了不同的可能性,有幕后只是其中之一。 通常情况下,这是C头(因为C ++编译器能够解析,而相反将无法正常工作),以及C ++头只包括和拉一切都变成命名空间std
。 或有使用或不解析相同的标题一些宏观魔法namespace std
缠与否。 对此补充说,在某些环境中,如果头没有一个文件扩展名(如编辑未能彰显代码等),它的尴尬。 因此,一些供应商将有<cmath>
是单衬里包括与一些其它头.h
扩展。 或一些将映射所有包括匹配<cblah>
到<blah.h>
其中,通过宏观魔法,成为C ++头时__cplusplus
被定义,否则成为C报头)或<cblah.h>
或任何。
这就是为什么在某些平台上包括像的原因<cmath.h>
这应该不存在,将初步成功,尽管它可能使编译壮观失败以后。
我不知道它的std您使用LIB实现。 我想这是自带的GCC的一个,但是这个我不知道,所以我不能解释你的情况正是如此。 但可以肯定的是上述供应商特定的黑客之一的组合和你包含一个头,你不应该把自己列入。 也许这是一个地方<cmath>
映射到<cmath.h>
与特定的,你却没有定义,这样就结束了两个定义(套)宏(S)。
但是请注意,此代码仍然不应该编译:
#include <cmath>
double f(double d)
{
return abs(d);
}
不应该有一个abs()
在全局命名空间(它的std::abs()
然而,按照上述实施技巧,有很可能是。 后来移植这样的代码(或只是想与你的供应商的下一个版本,它不容许这种编译)可能会非常繁琐,所以你应该留意这一点。
它归结为: math.h
是C
并创造了超过10年前。 在math.h中,由于其原始的性质, abs()
函数是“基本上”只为整数类型,如果你想获得双重的绝对值,你不得不使用fabs()
当C ++创建花了math.h
,并使其cmath
。 cmath
基本上MATH.H但C ++提高。 它改进之类的东西具有区分fabs()
和ABS,和只是由abs()
两个双打和整数类型。 综上所述之一:使用math.h中,并使用abs()
为整数, fabs()
双打或使用CMATH,只是有ABS的一切(更容易和建议)
希望这有助于谁是有同样的问题,任何人!
使用晶圆厂()代替ABS(),这是相同的,但对于花车,而不是整数。