首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法将int (*( int ))(int)转换为int (*(int))(int)

无法将int (*( int ))(int)转换为int (*(int))(int)
EN

Stack Overflow用户
提问于 2019-10-21 16:48:31
回答 3查看 482关注 0票数 0

我试图了解函数返回指向函数的指针,在尝试编译代码之后,它会给出这样的错误:

无法在赋值中将int (*(int))(int)转换为int (*(int))(int)

我知道这两个int (*(int))(int)是一回事,但是为什么会发生这个错误呢?

我正在使用g++编译这段代码

代码语言:javascript
复制
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变量的指针,但它只是给了我一些错误。

任何帮助都是非常感谢的,谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-10-21 16:54:44

您将fp2定义为函数本身,而不是指向函数的指针,这意味着您不能分配给它。您需要使它成为指向函数的指针:

代码语言:javascript
复制
int (*(*fp2)(int))(int);
fp2 = someFunc;

更好的是,使用typedef,这样代码就不会非常混乱:

代码语言:javascript
复制
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;
}
票数 4
EN

Stack Overflow用户

发布于 2019-10-21 16:55:47

看来你的意思是

代码语言:javascript
复制
int (*( *fp2 ) (int))(int);

fp2 = someFunc;

也就是说,应该将fp2声明为函数的指针。否则,您将尝试将赋值运算符应用于函数。

您可以通过引入别名来简化声明。

例如

代码语言:javascript
复制
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;
}
票数 1
EN

Stack Overflow用户

发布于 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函数的指针。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58490804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档