函数重载遇上函数指针
-将重载函数名赋值为函数指针时
1. 根据重载规则挑选与函数指针列表一致的候选者;
2. 严格匹配候选者的函数类型与函数指针的函数类型
看下面的代码:
#include <stdio.h>
int func(int x)
{
return x;
}
int func(int x, int y)
{
return x + y;
}
int func(int x, int y, int z)
{
return x * y * z;
}
typedef int(*PFUNC)(int a);
int main()
{
PFUNC p = func;
int c = p(1);
printf("c = %d
",c);
return 0;
}
打印结果c=1
做这样的修改,typedef void(*PFUNC)(int a);
编译时将出现这样的错误,
说明当函数重载遇上函数指针时,将严格匹配候选者的函数类型与函数指针的函数类型
注意:
-函数重载必然发生在同一个作用域中
-编译器需要用参数列表或函数类型进行函数选择。(返回值不作为重载的依据,但是当函数重载遇上函数指针时,就需要考虑返回值了,会进行严格的匹配)
无法直接通过函数名得到重载函数的入口地址
强调同一作用域的原因:
因为在C++中不止一个作用域,而C语言只有一个作用域-全局作用域。
看下面这个例子:
#include <stdio.h>
int func(int x)
{
return x;
}
int func(int x, int y)
{
return x + y;
}
int main()
{
printf("%p
",func);
printf("%p
",func);
return 0;
}
该程序说明,无法直接通过函数名得到重载函数的入口地址