搜索
bottom↓
回复: 33

单个文件C源码太长,请教大虾优雅的方式解决

[复制链接]

出5入8汤圆

发表于 2017-6-16 11:13:52 | 显示全部楼层 |阅读模式
单个文件C源码太长,阅读维护不便

1)分为几个c文件加引用声明太麻烦了.而且影响编译速度
2)把c分段冒充.h文件,inlude进来,好多编译器支持不好.

请教大虾如何优雅组织源码

出0入76汤圆

发表于 2017-6-16 11:15:47 | 显示全部楼层
模块化 模块化 模块化

出0入0汤圆

发表于 2017-6-16 11:41:08 | 显示全部楼层
最近也在考虑这个问题,因为单个函数有超过1千行代码量的情况。时间久了比较难看,遵循一个函数只有输入和输出,减少耦合。

出0入0汤圆

发表于 2017-6-16 11:43:04 | 显示全部楼层
有一个方法叫宏折叠

出0入33汤圆

发表于 2017-6-16 11:56:46 来自手机 | 显示全部楼层
有多大?sqlite3.c 单文件6兆多20万行

出0入0汤圆

发表于 2017-6-16 11:57:35 | 显示全部楼层
本帖最后由 lcw_swust 于 2017-6-16 12:05 编辑

不用冒充.h,直接#include "aaa.c",相当于把文件内容放到这了。
我的工程只添加一个main.c,其它的都在这个文件里include进去。
(其实我觉得.h和.c文件是一样的,仅仅是后缀不同而已)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2017-6-16 12:12:40 来自手机 | 显示全部楼层
lcw_swust 发表于 2017-6-16 11:57
不用冒充.h,直接#include "aaa.c",相当于把文件内容放到这了。
我的工程只添加一个main.c,其它的都在这个文 ...

那头文件呢?还是希望在main中 include?

出0入0汤圆

发表于 2017-6-16 12:13:05 来自手机 | 显示全部楼层
不点全编译一般不会影响速度啊  

出0入0汤圆

发表于 2017-6-16 12:42:11 来自手机 | 显示全部楼层
同样关注这个问题…

出0入147汤圆

发表于 2017-6-16 12:42:15 | 显示全部楼层
1)分为几个c文件加引用声明太麻烦了.而且影响编译速度


楼主不适合干编程。

出5入8汤圆

 楼主| 发表于 2017-6-16 13:36:33 | 显示全部楼层
zhenglingo 发表于 2017-6-16 11:41
最近也在考虑这个问题,因为单个函数有超过1千行代码量的情况。时间久了比较难看,遵循一个函数只有输入和 ...

我没那么大的函数,函数都不大,但函数多了,在一个c文件内也不易查看维护

出5入8汤圆

 楼主| 发表于 2017-6-16 13:39:01 | 显示全部楼层
lcw_swust 发表于 2017-6-16 11:57
不用冒充.h,直接#include "aaa.c",相当于把文件内容放到这了。
我的工程只添加一个main.c,其它的都在这个文 ...

我也这么认为,也是这么干的
无奈有些ide支持的不好,比如keil支持就非常差-不可在线跟踪调试(include进去的内容和调用静态库一样了,无法进入了)

出5入8汤圆

 楼主| 发表于 2017-6-16 13:40:23 | 显示全部楼层
lcw_swust 发表于 2017-6-16 11:57
不用冒充.h,直接#include "aaa.c",相当于把文件内容放到这了。
我的工程只添加一个main.c,其它的都在这个文 ...

请问在线调试时,可以进入include的代码里面吗?(函数内)

出0入0汤圆

发表于 2017-6-16 14:19:44 | 显示全部楼层
wt3333 发表于 2017-6-16 13:39
我也这么认为,也是这么干的
无奈有些ide支持的不好,比如keil支持就非常差-不可在线跟踪调试(include进去 ...

哦,我基本不在线调试,倒没注意这个问题。
调试时,点开View->Disassembly window看看。

出0入0汤圆

发表于 2017-6-16 14:32:04 | 显示全部楼层
看了下我手上的产品的核心文件,4296行。

出0入0汤圆

发表于 2017-6-16 14:36:18 | 显示全部楼层
wt3333 发表于 2017-6-16 13:40
请问在线调试时,可以进入include的代码里面吗?(函数内)

可以进去的,我经常写菜单这么做,很好用,就是程序给了不这么用的人找不到C文件

出0入20汤圆

发表于 2017-6-16 14:38:21 | 显示全部楼层
本帖最后由 mon51 于 2017-6-16 14:40 编辑

审过一个学生自己写的FAT文件系统,就一个C文件,里面的GOTO有几十个。一个函数包括:格式化,读写等全在一起。在PC上模拟居然可以用。。。但最后主审说:违背了C模块化的宗旨,没有通过。
我自己写代码:电脑一页显示基本就是一个C文件。每一个C对应一个H,H里面绝对不声明任何函数和变量。

出0入0汤圆

发表于 2017-6-16 14:54:06 | 显示全部楼层
多文件,没有别的办法

出0入442汤圆

发表于 2017-6-16 15:52:22 来自手机 | 显示全部楼层
mon51 发表于 2017-6-16 14:38
审过一个学生自己写的FAT文件系统,就一个C文件,里面的GOTO有几十个。一个函数包括:格式化,读写等全在一 ...

这样子只能写些简单的单片机程序了。否则代码管理会出大问题。想象一下,一个几百万行的工程,有几万个文件。。。

出0入0汤圆

发表于 2017-6-16 16:01:52 | 显示全部楼层
建议楼主多看看其他开源项目的做法,比如uboot,linux之类的,不用看懂每个源文件的内容,看看架构就行

出0入0汤圆

发表于 2017-6-16 16:18:33 来自手机 | 显示全部楼层
本帖最后由 weichao4808335 于 2017-6-16 16:20 编辑
mon51 发表于 2017-6-16 14:38
审过一个学生自己写的FAT文件系统,就一个C文件,里面的GOTO有几十个。一个函数包括:格式化,读写等全在一 ...


如果直接拿linux和ucos的代码你们照样审核不过,但是这两个都是公认的好代码,对于goto不能谈虎色变,该用还得用!

出0入4汤圆

发表于 2017-6-16 16:25:12 来自手机 | 显示全部楼层
mon51 发表于 2017-6-16 14:38
审过一个学生自己写的FAT文件系统,就一个C文件,里面的GOTO有几十个。一个函数包括:格式化,读写等全在一 ...

这也太教条了,不如直接把c里的goto取消算了

出0入8汤圆

发表于 2017-6-16 16:38:54 | 显示全部楼层
本帖最后由 security 于 2017-6-16 16:42 编辑

优雅的方式,就是第一条的做法,也就是模块化,没有其他路子!

至于用 include 将源码文件引用进来,这种做法还是少做为妙,不信的话,你可以去看开源项目,看看这种做法多不多。

楼主需要多看看开源项目。

出0入59汤圆

发表于 2017-6-16 16:39:48 | 显示全部楼层
规范化的做法还是多文件,没啥可说的

出0入20汤圆

发表于 2017-6-16 16:55:29 | 显示全部楼层
wye11083 发表于 2017-6-16 15:52
这样子只能写些简单的单片机程序了。否则代码管理会出大问题。想象一下,一个几百万行的工程,有几万个文 ...


看来你没有做过大项目了:十几个人一个开发团队,一个项目总负责,分解出项目的N各模块,再由几个人写出各模块的函数格式要求,剩下的人全去写模块内的代码,各自编译测试,提交DLL或LIB。

出5入8汤圆

 楼主| 发表于 2017-6-16 18:09:57 | 显示全部楼层
weichao4808335 发表于 2017-6-16 14:36
可以进去的,我经常写菜单这么做,很好用,就是程序给了不这么用的人找不到C文件
...

我用的keil 5 到调用函数就进不去了.
请教  您的开发环境

出0入20汤圆

发表于 2017-6-16 18:43:22 | 显示全部楼层
其实啥都不要,LZ需要一个具有code map的现代编辑器。

出0入0汤圆

发表于 2017-6-16 18:53:50 来自手机 | 显示全部楼层
分多个c全量编译会变慢,但用增量编译会更快,分多个.c更多是为了模块化解耦,只是为了查看方便用source insight一万行代码也压力不大。

出0入0汤圆

发表于 2017-6-16 20:07:01 来自手机 | 显示全部楼层
看到你感觉像是我所接手的工程的主人

出0入0汤圆

发表于 2017-6-16 20:20:23 来自手机 | 显示全部楼层
Ray______ 发表于 2017-6-16 20:07
看到你感觉像是我所接手的工程的主人

哈哈  苦主找过来了

出0入0汤圆

发表于 2017-6-16 21:14:59 来自手机 | 显示全部楼层
接手过一个项目,其中某个模块一个C文件7,8千行,各种变量满天飞,看到想死的心都有了

出0入8汤圆

发表于 2017-6-16 21:44:08 | 显示全部楼层
mon51 发表于 2017-6-16 16:55
看来你没有做过大项目了:十几个人一个开发团队,一个项目总负责,分解出项目的N各模块,再由几个人写出 ...

没有全局变量,都是靠函数参数、返回值传递信息?应该有公共的消息队列吧

出0入0汤圆

发表于 2017-6-17 08:15:58 | 显示全部楼层
wt3333 发表于 2017-6-16 18:09
我用的keil 5 到调用函数就进不去了.
请教  您的开发环境

mdk肯定可以的啊,我用keil4

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2017-6-18 00:08:09 | 显示全部楼层
huangqi412 发表于 2017-6-16 20:20
哈哈  苦主找过来了

诉苦一下,一个case 里面就能上千行,能想象一个函数多少行....
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 06:48

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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