请教MFC cannot convert from void (*)(void) to void编译出错

weixin_42107206 2022-11-13 23:21:48

typedef struct
    {
         void(*foo)(void);
    }A;

A a;

void fun(void);

a.foo = fun;这句怎么编译出错?

...全文
121 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2022-11-21
  • 打赏
  • 举报
回复

理解和讨论之前,请先学会如何观察!
仅供参考:

//char (*(*x[3])())[5];//x是什么类型的变量?
//
//分析C语言声明,关键是搞清楚这个变量是个什么东西(函数、指针、数组),
//是函数那么剩下的就是他的参数和返回值,
//是指针那剩下部分是说明他指向什么,
//是数组剩下的部分就是说明数组的成员是什么类型。
//解析C语言声明规则:
//从左侧第一个标识符开始,按照优先级进行结合。*表示是..的指针,const表示只读的,volatile表示可变的,[]表示是数组,()表示是函数。
//
//x和[3]结合说明是一个大小为3的数组,该数组的每个元素为一类指针,该类指针指向一类函数,该类函数无参数,返回一类指针,该类指针指向一个大小为5的char型数组
#include <stdio.h>
#include <typeinfo.h>
char num[5];
char (*x00())[5] {
    return &num;
}
int main() {
    char (*(*x[3])())[5];//是个数组,大小为3
    char (*(*x0  )())[5];//数组的元素,是个函数指针
    char (*( x00 )())[5];//函数原型,参数为空,返回值为指针
    char (*  x000   )[5];//返回值

    x0 = x00;
    x[0] = x0;
    x[1] = x0;
    x[2] = x0;
    printf("typeid(x).name() is %s\n",typeid(x).name());
    return 0;
}
//typeid(x).name() is char (* (__cdecl**)(void))[5]


wst_test 2022-11-18
  • 打赏
  • 举报
回复

类型不一样。
你的类成员函数的完整类型是
返回类型 (调用协定 类::) (参数) 这种类型的函数指针也就是
void (__cdecl CTestDlg::
) (); 调用协定同一个文件里一样的
所以你只需要把指针成员改成 void(CTestDlg::foo)(void);就能保存一个指向类成员函数的指针。
但是这一般不是好的方法,通常你要调用一个类的成员函数,你应该保存这个类对象的指针/引用,
例如一个CTestDlg
pDlg;
再通过它去pDlg->fun()

weixin_42107206 2022-11-19
  • 举报
回复
@wst_test CTESTDlg *pDlg = (CTESTDlg*)(AfxGetApp()-&gt;m_pMainWnd); a.foo = pDlg-&gt;fun; 这样也编译不过
weixin_42107206 2022-11-19
  • 举报
回复
@weixin_42107206 -&gt;怎么变成了-&了
wst_test 2022-11-19
  • 举报
回复
@weixin_42107206 你不需要a.foo 来保存一个成员函数的地址了。因为你已经有一个CTESTDlg * pDlg,你可以直接用他来调用pDlg-&gt;fun();当然fun必须是CTestDlg的成员函数
Eleven 2022-11-15
  • 打赏
  • 举报
回复

你的 void fun(void);是在哪里定义的?

weixin_42107206 2022-11-17
  • 举报
回复
@Eleven 在public里这样写的:void CTestDlg:: fun(void);
zgl7903 2022-11-15
  • 打赏
  • 举报
回复

明确调用规约试试看

typedef struct 
{
  void(__cdecl *foo)(void);
}A;

void __cdecl fun(void)
{
}
void Test()
{
  A a;
  a.foo = fun;
  a.foo();
}

weixin_42107206 2022-11-17
  • 举报
回复
@zgl7903 放在cpp里面,不加__cdecl也可以编译通过。但是把这段 typedef struct { void(__cdecl *foo)(void); }A; 放在TESTDlg.h里面的public下,就报错了。而且 void __cdecl fun(void) { } 加上CTESTDlg::后,也不好使了。
weixin_42107206 2022-11-14
  • 打赏
  • 举报
回复

函数或数组,在MFC这样写编译不过,但是在C里却是正常的。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧