我试图了解函数返回指向函数的指针,在尝试编译代码之后,它会给出这样的错误:
无法在赋值中将
int (*(int))(int)转换为int (*(int))(int)。
我知道这两个int (*(int))(int)是一回事,但是为什么会发生这个错误呢?
我正在使用g++编译这段代码
int sum(int i){
return i+i;
}
int (*fp)(int) = sum;
int (*someFunc(int))(int a){
return fp;
}
int main(){
int i = 1;
int (*fp2(int))(int);
fp2 = someFunc;
return 0;
}我希望fp2将是一个指向fp变量的指针,但它只是给了我一些错误。
任何帮助都是非常感谢的,谢谢
发布于 2019-10-21 16:54:44
您将fp2定义为函数本身,而不是指向函数的指针,这意味着您不能分配给它。您需要使它成为指向函数的指针:
int (*(*fp2)(int))(int);
fp2 = someFunc;更好的是,使用typedef,这样代码就不会非常混乱:
typedef int func1(int);
typedef func1 *func2(int);
int sum(int i) {
return i+i;
}
func1 *fp = sum;
func1 *someFunc(int a) {
return fp;
}
int main() {
int i = 1;
func2 *fp2 = someFunc;
return 0;
}发布于 2019-10-21 16:55:47
看来你的意思是
int (*( *fp2 ) (int))(int);
fp2 = someFunc;也就是说,应该将fp2声明为函数的指针。否则,您将尝试将赋值运算符应用于函数。
您可以通过引入别名来简化声明。
例如
int sum(int i){
return i+i;
}
using Fp = int( * )( int );
Fp fp = sum;
Fp someFunc(int){
return fp;
}
int main()
{
Fp ( *fp2 ) (int);
fp2 = someFunc;
return 0;
}发布于 2019-10-21 18:54:38
我花了一段时间才解决了与函数指针有关的问题,但我推荐以下规则:(a)对任何用户定义的存储类使用typedef语句,这些存储类允许将每种类型作为一个单独的事物(例如,typedef struct _mystruct_ MyStruct;)处理。遵循这个快捷方式可以实现:(b)三部分表达式(例如RETURN-TYPE (POINTER-DECLARATION)(LIST-OF-ARGUMENT-TYPES);)的每个部分都应该包含--一组圆括号,但最左边的项不包含括号,表达式的中间项是变量的名称(因此包含星号*),例如,int (*_mainPtr)(int, const char *[]);应该在程序中定义指向main函数的指针。
https://stackoverflow.com/questions/58490804
复制相似问题