打印
[C语言]

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

[复制链接]
2371|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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 | 只看该作者
好像以上也不行,结构定义不了

使用特权

评论回复
5
William1994| | 2022-1-19 12:30 | 只看该作者
没有更好的办法,公司再做个强制规定,demo_s * this; 后面的这个变量名必须叫this,这就有了手动this call,只是楼主提的缺陷暂时无法解决。

使用特权

评论回复
6
ee168|  楼主 | 2022-1-19 12:31 | 只看该作者
这个是想在C语言中实现C++的功能,引入类的概念,C++中的关键词 this 应该可以

使用特权

评论回复
7
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 库,就是这种风格,第一个参数是一个结构体指针。

使用特权

评论回复
8
叶春勇| | 2022-1-19 15:19 | 只看该作者
我用c语言实现的话
typedef struct
{
...
}stru;

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

斯坦福的视频《范式编程》也是这么弄的。里面有个栈的实现,类似语法。
不过很多单片机支持c++,stm32,avr,stm8都支持。

使用特权

评论回复
9
e_007| | 2022-1-19 15:45 | 只看该作者
本帖最后由 e_007 于 2022-1-19 22:21 编辑

...

使用特权

评论回复
10
e_007| | 2022-1-19 19:15 | 只看该作者
本帖最后由 e_007 于 2022-1-20 21:25 编辑

....

使用特权

评论回复
11
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);
}

使用特权

评论回复
12
keer_zu| | 2022-1-20 09:06 | 只看该作者
可以到我的个人版里看看,里面有很多类似例子
https://bbs.21ic.com/iclist-466-1.html

使用特权

评论回复
13
keer_zu| | 2022-1-20 09:08 | 只看该作者

使用特权

评论回复
14
叶春勇| | 2022-1-20 09:21 | 只看该作者
keer_zu 发表于 2022-1-20 09:01
要么用C++,要么传进去void 指针,在里面强制转化回来。
typedef struct
{

这个比较通用,应该定义void比较好。

使用特权

评论回复
15
xyz549040622| | 2022-1-20 11:41 | 只看该作者
大家各种秀技,表示这样太复杂了。

使用特权

评论回复
16
keer_zu| | 2022-1-21 14:45 | 只看该作者
xyz549040622 发表于 2022-1-20 11:41
大家各种秀技,表示这样太复杂了。

没有复杂啊?变量散得到处都是才复杂,最后自己都蒙圈了。

使用特权

评论回复
17
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();
        }
}

使用特权

评论回复
18
昱枫| | 2022-1-21 16:13 | 只看该作者
能用就好

使用特权

评论回复
19
QuakeGod| | 2022-1-22 22:25 | 只看该作者
另外,提一点,纯C语言的结构体里面是没有函数的,(最多有个函数指针,但是没有啥根本意义)
所以不存在什么变量被“结构体内的函数”调用问题,所有的函数都是全局函数。

使用特权

评论回复
20
七颗咖啡豆| | 2022-1-28 16:36 | 只看该作者
ee168 发表于 2022-1-19 11:52
是不是能这样写

typedef struct
#include <stdio.h>


typedef struct _MY_DEMO{
    int x;
    int y;
    int (*add)(struct _MY_DEMO *dd);
}MY_DEMO;

int add(struct _MY_DEMO *dd)
{
    return dd->x + dd->y;
}

int main(int argc,char *argv[])
{
    int total;
    MY_DEMO dd;
    dd.add = add;
    dd.x = 3;
    dd.y = 4;

    total = dd.add(&dd);
    printf("total=%d\n",total);
    return 0;
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

114

主题

200

帖子

2

粉丝