我正在尝试学习有关返回指向函数的指针的函数的信息,在尝试编译代码后,它给了我这种错误:
无法将分配中的
int (*(int))(int)
转换为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; }
。
我知道那两个{{1}}是同一件事,但是为什么会发生此错误?
我正在使用g ++编译此代码
{{1}}
我希望fp2是指向fp变量的指针,但这只会给我一些错误。
感谢您的帮助,谢谢
答案 0 :(得分:3)
您将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;
}
答案 1 :(得分:1)
似乎您的意思是以下
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;
}
答案 2 :(得分:0)
花了我一段时间来解决与函数指针有关的问题,但是我建议使用以下规则:(a)对任何允许将每种类型都视为一种类型的用户定义存储类使用typedef
语句一件事(例如typedef struct _mystruct_ MyStruct;
)。使用此快捷方式可以实现:(b)三部分表达式的每个部分(例如RETURN-TYPE (POINTER-DECLARATION)(LIST-OF-ARGUMENT-TYPES);
)都应包含一组括号,但最左边的术语中应包含 no ,并且表达式的中间项是变量的名称(因此,容器中包含星号[{*
]),例如int (*_mainPtr)(int, const char *[]);
应该定义指向{{1 }}函数。