使用pow函数时理解什么是函数重载概念

3

我最近接触了编程世界和C语言。

当我尝试使用math.h库中的pow函数进行一些计算时,我遇到了一个难以理解的概念。

当我将两个变量x和i作为参数传递给pow函数,这两个变量均声明为整数时,我的IDE(Visual Studio 2012)报错:

“more than one instance of overloaded function “pow” matches the argument list" :

Function “pow(double _X, int _Y)”
Function “pow(float _X , int _Y)”
Function “pow(float _X , int _Y)”
Function “pow(long double _X, int _Y)”

Argument types are ( int, int ).

我知道pow函数返回一个double值,但如果你只需要使用整数怎么办?为什么不能将函数的返回值存储到声明的变量中作为double,并将两个整数作为参数?
在Stack Overflow找不到相关信息时,我在Wikipedia上搜索时发现,对于函数重载,唯一给出的定义是以下内容:
“函数重载或方法重载是各种编程语言(如Ada、C++、C#、D和Java)中的一种特性,允许创建几个具有相同名称但在函数的输入和输出类型上有所不同的方法。简单地定义为一个函数能够执行不同的任务。”
函数重载是什么,它如何影响我尝试实现的这个特定函数的行为?
如果问题太琐碎或被解答,或者我错过了显而易见的拼图,请提前谅解。

3
C语言中不存在函数重载。 - glglgl
1
从C99开始,出现了所谓的类型通用宏,即tgmath,这种宏与函数重载类似,但实现方式不同。详情请参考http://pubs.opengroup.org/onlinepubs/009696699/basedefs/tgmath.h.html。话说回来,我认为OP可能是在使用C++模式编译而非C模式。 - Brandin
3个回答

2
你正在使用C++编译器,(传统的) C语言中没有函数重载。
因此,在这些情况下我们有不同的函数 (参见这里的手册页面):
  • double pow(double x, double y);
  • float powf(float x, float y);
  • long double powl(long double x, long double y);
所以从函数名就可以清楚地知道涉及到的类型。
自C99版本的C开始,你可以使用泛型来实现这一点,并且在<tgmath.h>头文件中已经完成了。该头文件提供了一个使用重载的pow()函数。
然而,从你的错误输出中很明显你没有这样的C编译器。

也许可以提一下如何在VS12中进行C编译? - chux - Reinstate Monica
@EricPostpischil 哎呀。谢谢。 - unwind

1
C语言中没有函数重载。
C语言中唯一的重载是编译器中的运算符重载(int + int, float + float,& 作为取地址符,& 作为按位与,* 作为指向,* 作为乘法...)。

0

你不能重载一个函数。但是如果你使用double、int、short、long、float,你可以编写一个单一的函数并传递转换后的参数。

double  pow(double, double);

int a;
int b;

int c = (int)pow((double)a, (double)b);

你必须选择最大的类型。这是一个与编译器相关的简单技巧。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接