[C语言] C语言结构体中的变量如何被结构体内函数调用?

[复制链接]
 楼主| ee168 发表于 2022-1-19 11:37 | 显示全部楼层 |阅读模式
struct
{
        int x,y;
        int (*add)(int,int);
}demo_s


int add(int x, int y)
{
        return x+y;
}
一般是这样使用
int total;
main()
{
        demo_s demo;
        demo.add = add;
        total = demo.add(3,4);
        while(1);
}


如果我要add的输入参数是demo里的x,y,不知道如何实现,有什么办法吗?

ayb_ice 发表于 2022-1-19 11:43 | 显示全部楼层
total = demo.add(demo.x,demo.x);
 楼主| ee168 发表于 2022-1-19 11:52 | 显示全部楼层
本帖最后由 ee168 于 2022-1-19 12:03 编辑

是不是能这样写

typedef struct
{
        int x,y;
        int (*add)(demo_s *demo);
}demo_s


int add(demo_s *demo)
{
        return demo->x + demo->y;
}
int total;
main()
{
        demo_s demo;
        demo.add = add;
        demo.x = 3;
        demo.y = 4;


        total = demo.add(&demo);
        while(1);
}


不知道有没有什么更好的办**

 楼主| ee168 发表于 2022-1-19 12:06 | 显示全部楼层
好像以上也不行,结构定义不了
William1994 发表于 2022-1-19 12:30 | 显示全部楼层
没有更好的办法,公司再做个强制规定,demo_s * this; 后面的这个变量名必须叫this,这就有了手动this call,只是楼主提的缺陷暂时无法解决。
 楼主| ee168 发表于 2022-1-19 12:31 | 显示全部楼层
这个是想在C语言中实现C++的功能,引入类的概念,C++中的关键词 this 应该可以
QuakeGod 发表于 2022-1-19 12:51 | 显示全部楼层
本帖最后由 QuakeGod 于 2022-1-19 12:52 编辑
ee168 发表于 2022-1-19 12:31
这个是想在C语言中实现C++的功能,引入类的概念,C++中的关键词 this 应该可以

是的,如果想引入类的概念,函数需要一个指针做参数。
另外,结构体里面可以不用定义函数指针,直接定义全局函数即可,全局函数的第一个参数是结构体指针。
当然如果这样定义全局函数的话,编程风格就还是原来的C风格,和C++不太一样了。
像我们开发stm32 用的 HAL 库,就是这种风格,第一个参数是一个结构体指针。

叶春勇 发表于 2022-1-19 15:19 | 显示全部楼层
我用c语言实现的话
typedef struct
{
...
}stru;

my_add(stru *s,int x,int y);
然后做成一个库。

斯坦福的视频《范式编程》也是这么弄的。里面有个栈的实现,类似语法。
不过很多单片机支持c++,stm32,avr,stm8都支持。
e_007 发表于 2022-1-19 15:45 | 显示全部楼层
本帖最后由 e_007 于 2022-1-19 22:21 编辑

...

e_007 发表于 2022-1-19 19:15 | 显示全部楼层
本帖最后由 e_007 于 2022-1-20 21:25 编辑

....
keer_zu 发表于 2022-1-20 09:01 | 显示全部楼层
要么用C++,要么传进去void 指针,在里面强制转化回来。
typedef struct
{
        int x,y;
        int (*add)(void *param);
}demo_s


int add(void *param)
{        demo_s *demo = (demo_s *)param;

        return demo->x + demo->y;
}

调用:

int main()
{
    int ret;

    demo_s demo = {
        .x = 20,
        .y = 15,
        .add = add;
    };

    ret = demo.add(&demo);
}
keer_zu 发表于 2022-1-20 09:06 | 显示全部楼层
可以到我的个人版里看看,里面有很多类似例子
https://bbs.21ic.com/iclist-466-1.html
keer_zu 发表于 2022-1-20 09:08 | 显示全部楼层
叶春勇 发表于 2022-1-20 09:21 | 显示全部楼层
keer_zu 发表于 2022-1-20 09:01
要么用C++,要么传进去void 指针,在里面强制转化回来。
typedef struct
{

这个比较通用,应该定义void比较好。
xyz549040622 发表于 2022-1-20 11:41 | 显示全部楼层
大家各种秀技,表示这样太复杂了。
keer_zu 发表于 2022-1-21 14:45 | 显示全部楼层
xyz549040622 发表于 2022-1-20 11:41
大家各种秀技,表示这样太复杂了。

没有复杂啊?变量散得到处都是才复杂,最后自己都蒙圈了。
ayb_ice 发表于 2022-1-21 15:11 | 显示全部楼层
本帖最后由 ayb_ice 于 2022-1-21 15:29 编辑

#define class        struct

typedef class MyClass_Typedef{
        u08 x;
        u08 y;
        u8 (*Add)(class MyClass_Typedef* pThis);
       
};


u8 MyAdd(class MyClass_Typedef* pThis)
{
        return pThis->x + pThis->y;
}


#define CLASS_API(CALSS, API)        CALSS.API(&CALSS)

void main(void)
{
        class MyClass_Typedef MyClass;
       
        MyClass.Add = &MyAdd;

        while (1)
        {
                u8 y = CLASS_API(MyClass, Add);
                __nop();
        }
}
昱枫 发表于 2022-1-21 16:13 | 显示全部楼层
能用就好
QuakeGod 发表于 2022-1-22 22:25 | 显示全部楼层
另外,提一点,纯C语言的结构体里面是没有函数的,(最多有个函数指针,但是没有啥根本意义)
所以不存在什么变量被“结构体内的函数”调用问题,所有的函数都是全局函数。
七颗咖啡豆 发表于 2022-1-28 16:36 | 显示全部楼层
ee168 发表于 2022-1-19 11:52
是不是能这样写

typedef struct
  1. #include <stdio.h>


  2. typedef struct _MY_DEMO{
  3.     int x;
  4.     int y;
  5.     int (*add)(struct _MY_DEMO *dd);
  6. }MY_DEMO;

  7. int add(struct _MY_DEMO *dd)
  8. {
  9.     return dd->x + dd->y;
  10. }

  11. int main(int argc,char *argv[])
  12. {
  13.     int total;
  14.     MY_DEMO dd;
  15.     dd.add = add;
  16.     dd.x = 3;
  17.     dd.y = 4;

  18.     total = dd.add(&dd);
  19.     printf("total=%d\n",total);
  20.     return 0;
  21. }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

115

主题

201

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部