硬汉嵌入式论坛

 找回密码
 立即注册
查看: 673|回复: 6
收起左侧

划水贴!尝试在C语言中实现Python中库的使用方法

[复制链接]

7

主题

31

回帖

52

积分

初级会员

积分
52
发表于 2025-1-23 16:46:42 | 显示全部楼层 |阅读模式
本帖最后由 LY_Bear 于 2025-1-23 23:38 编辑

1、背景

最近在回忆之前写的循环队列的代码,虽然代码有不少问题,但是其中有一个代码编写思路倒是让我联想起python中调用库的场景。
在此总结一下,为有需要的人提供一些代码思路。

2、原理
我们需要先在头文件中定义一个只放源文件中定义的函数的函数指针结构体(如图1),之后用 extern const 声明一个此结构体类型的常量
(示例:extern const xx_ts xxFns; 其中_ts表示使用了typedef重命名的struct,Fns表示函数集)。

我们声明的xxFns常量将在与头文件对应的源文件中实现;在源文件中,把对应函数地址赋值给对应结构体成员,
这样就完成了对xxFns常量的初始化(如图2)。

使用该函数则以以下形式调用
xxFns.xxx(arg0,arg1,arg2);

图1
1737619462069.png
图2
1737621972610.png

3、优点
由于我们的头文件中没有独立的函数声明,这样就不会污染函数的命名空间,有很多函数名就可以重用(比如:init函数);
函数集中化管理,通过常量调用函数,这样实现了类似于python中对于库的调用形式;这样也方便了查找和函数名的简化。

4、缺点
涉及指针的使用,效率可能会有一定的影响。
常量可能会被未定义操作改写,导致调用错误。

5、结语
新手上路,还请多多指教!

(个人感觉这种编写方法比较适合用在一些可重入的工具类函数中,比如自己写的数学函数库,就可以用这种写法。)



回复

使用道具 举报

3

主题

163

回帖

172

积分

初级会员

积分
172
发表于 2025-1-24 08:59:24 | 显示全部楼层
这不是很常用的C语言写法吗?linux内核一堆都是这种写法啊,不是很懂跟python有什么关系?
回复

使用道具 举报

5

主题

19

回帖

34

积分

新手上路

积分
34
发表于 2025-1-24 10:44:31 | 显示全部楼层
这个方式好看不好用,跳转函数的时候,不会直接跳到.c文件,很痛苦
回复

使用道具 举报

7

主题

31

回帖

52

积分

初级会员

积分
52
 楼主| 发表于 2025-1-25 10:27:20 来自手机 | 显示全部楼层
jackhbkarm 发表于 2025-1-24 08:59
这不是很常用的C语言写法吗?linux内核一堆都是这种写法啊,不是很懂跟python有什么关系?

就是调用方式和python的库调用比较像,没其他的。那和那个写的一般会附加一些其他的参数,这个就只是单纯的函数集
回复

使用道具 举报

7

主题

31

回帖

52

积分

初级会员

积分
52
 楼主| 发表于 2025-1-25 10:28:05 来自手机 | 显示全部楼层
叮个隆咚呛 发表于 2025-1-24 10:44
这个方式好看不好用,跳转函数的时候,不会直接跳到.c文件,很痛苦

有好有坏吧,是提一个思路
回复

使用道具 举报

7

主题

31

回帖

52

积分

初级会员

积分
52
 楼主| 发表于 2025-1-25 10:31:41 来自手机 | 显示全部楼层
叮个隆咚呛 发表于 2025-1-24 10:44
这个方式好看不好用,跳转函数的时候,不会直接跳到.c文件,很痛苦

对不知道函数内容的人来说确实比较痛苦,但如果那东西是你自己写的话,这种问题就还算可控。还有就是大多数人来说不需要知道函数内容是什么,你只要知道怎么用就行了。这个在签名中单独写好注释就行。这个新法的主要优点就在于它不怎么会污染命名环境,然后调用相对简单。
回复

使用道具 举报

7

主题

31

回帖

52

积分

初级会员

积分
52
 楼主| 发表于 2025-1-26 23:08:03 来自手机 | 显示全部楼层
叮个隆咚呛 发表于 2025-1-24 10:44
这个方式好看不好用,跳转函数的时候,不会直接跳到.c文件,很痛苦

突然想起来这种写法比较像C++20里面模块的概念…
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-6-10 17:26 , Processed in 0.278197 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表