关于软件工艺,C语言[不抛砖,盼引玉]

ies_sweet 2009-07-05 05:54:46
加精
大家好!

我是一名参加工作4年的IT民工,目前在一家中型企业从事嵌入式软件开发维护工作。我们使用的语言工具为C语言,软件平台是风河公司的vxWorks,产品为一款工业级小型终端设备。

我在软件开发维护的工作中,发现很多bug并不是大的技术缺陷造成的,而是由于不好的代码风格造成的。而我们公司对于代码风格也有一定的规定和要求,但是各个产品组并不是很统一,感觉各有利弊。我想把我有疑问的几点提出来,希望工作经验丰富的老师能够结合自己的经验,给出一些指导。不胜感激。

1,关于命名规则。我们采用的是 “类型+含义”的方式,比如 char cOperateType。但是有的时候名字会比较长,如果采用缩写,含义又有可能不清晰。

2,关于头文件。头文件是否应该和实现文件一一对应?哪些东西应当放在头文件里?如果需要引用外部函数或外部全局变量,是该引用其头文件还是直接在本文件声明?各有什么利弊呢?

3,关于封装。C的封装性比较差,但是软件工程模块化设计又要求有比较好的封装,用什么样的规则能够比较好的实现呢?现在我们的工程耦合性很强,经常是改动了1处牵动了全身。大家对于封装性都是持肯定态度的,但是苦与没有找到很好的方法,有没有比较好的规则可以遵守呢?

4,关于数据结构的定义。我们现在基本有两种观点:一,定义一个大的数据结构,包含了主要的控制字段、数据区地址、函数方法指针等,从主函数下去,几层函数的接口都使用这个结构的指针;二,将各控制信息、数据区打散,函数方法就地使用(要求函数方法全部声明为外部)。第1种方法感觉封装性好,但是程序阅读的时候有点困难,而且调试的时候不太方便(带着一个大结构走,主机反应速度变慢);第2种方法感觉信息全部暴露。请专家予以指导。

5,关于pclint。我们没有使用pclint,其他组有使用的。我感觉lint工具太过于严格,不知道用过的前辈有什么感受,或者有什么建议。

另外,我们的软件规模大约30万--50万,C语言,嵌入式软件。
...全文
2696 135 打赏 收藏 转发到动态 举报
写回复
用AI写文章
135 条回复
切换为时间正序
请发表友善的回复…
发表回复
qianyinggaozhong 2012-10-21
  • 打赏
  • 举报
回复
真的是学习了啊,还没编过这么大的程序呢啊!
冰冷的热泪 2012-07-31
  • 打赏
  • 举报
回复
至今还没做过项目的感觉很担忧~!
kuanghonggui 2012-04-17
  • 打赏
  • 举报
回复
大一新生,c 菜鸟学习了;膜拜大神
lonten 2010-07-16
  • 打赏
  • 举报
回复
很受用,我要潜心学习,差距太太太太太太大了,膜拜两位大牛
a250871207 2010-06-11
  • 打赏
  • 举报
回复
辩论结束 我来最后报道下 难以想像在这里都这么激烈 啧啧
adocool 2010-06-06
  • 打赏
  • 举报
回复
新生 报道。。
hshdld 2010-03-17
  • 打赏
  • 举报
回复
学习了
奇迹未来 2010-03-11
  • 打赏
  • 举报
回复
强人啊!太强了,能拜个师傅么?偶现在刚刚在学C没什么底子,对编程很感兴趣。。你们两个可以一起收我为徒嘿嘿,我以后判断你们两个谁强悍。。。。!
nieyifan 2010-02-20
  • 打赏
  • 举报
回复
引用楼主 ies_sweet 的回复:
        3,关于封装。C的封装性比较差,但是软件工程模块化设计又要求有比较好的封装,用什么样的规则能够比较好的实现呢?现在我们的工程耦合性很强,经常是改动了1处牵动了全身。大家对于封装性都是持肯定态度的,但是苦与没有找到很好的方法,有没有比较好的规则可以遵守呢?


由于对于楼主具体的工程实现不了解,谈一下大概想法,大家探讨。

楼主认为C的封装性差&工程耦合性很强,进而造成了“牵一发而动全身”的局面,我个人认为还是由于模块划分以及解耦合方面做的不好。

举个小小的例子,模块A,模块B需要共享数据C,都需要对其进行读取,修改等,那么可以考虑将数据C放入模块C中来进行管理。模块C可以对外提供调用接口,用于CheckOut和CheckIn数据(说白了,就是对数据C进行加锁、解锁操作,防止模块A、B同时去修改,类似操作系统的管理)。另外还可以提供接口ReadData,这样就可以在不需要修改数据的时候只是得到数据的当前值,等等……

个人认为,在这种情况下,就可以较好的对模块进行封装。虽然调用接口肯定要比直接对全局变量进行操作效率要来的低一些,但是整体看来,无论是安全性,可维护性,都会极大的得到提升。

ivan.1011@yahoo.com.cn
有兴趣的同学也可以发邮件进行交流……
Totoro_zwj 2010-02-11
  • 打赏
  • 举报
回复
我日看的我头晕,感觉自己差距很大,以后不能玩游戏了。要好好学习
mengxianggood 2010-02-10
  • 打赏
  • 举报
回复
都说的很好,进来学习一下
dengsf 2010-02-09
  • 打赏
  • 举报
回复
操作系统(或底层软件)用C,偶尔配合汇编,
我认为其目的只是为了更好地控制对内存占用及其所在地址。
C++不少高级功能的具体实现由编译器自定,很难在不同环境中通用。
还有其它原因,基本上每个平台都有C编译器,C++则不然。
malajisi01 2009-12-21
  • 打赏
  • 举报
回复
[Quote=引用 118 楼 fetag 的回复:]
我也懒得和你这种呆子废话

总以为自己有两下子,那么多OS厂商的大牛难道就不如你?还扯什么“OS是基于已有的模式,C++出现的晚,不愿意重新用C++来

写”,你不觉得这理由就像笑话一样可笑吗?

linux从2.4跨到2.6,为啥不用C++重写?

XP开发的时候,MS已经封装好了MFC了,那为什么就不用C++开发内核?XP相对于98来说,可是完全的重写啊!

vista和windows 7是完全的推倒重新开发,为啥不用C++?

在内核上,大的厂家都不用C++,而在内核之上的层面,就开始大量使用C++了,甚至都很少用C了,上世纪四大编译器厂商混战

的事,估计你都没听过吧

你还好意思强调你们的项目,标C写的东西你们用C++移植,而且还是基于已有的平台,你们觉得很伟大是不?说白了,这是弱智

都能干的工作。你们为啥不在那个没有C++编译器的平台上去写个C++的编译器呢?

听你说的话,还觉得研究通了C++的规则和编译器就一劳永逸了,你知道多重继承在各个编译器里面是怎么实现的不?你更不知道

编译器的底层实现了吧?别说你或者你们公司了,编译器连中国都不敢吹牛。OS内核和编译器这是两个衡量国家IT水平的重要标

准,我不觉得这个是简单的事。恩,可能你觉得,学过编译原理就能写编译器了啊,聚变和裂变的原理你也学过呢,你能做出来

原子弹和氢弹吗?

此贴是最后的回复,最近总遇到这些二愣子,懒得和你们废话
[/Quote]
学术争论挺好的~~ 千万都别人身攻击,别生气阿二位,百家争鸣,百花齐放请~
malajisi01 2009-12-20
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 fetag 的回复:]
客观的说,你所讨论的不是语言层次的问题,而是思想层次的问题

语言的一些特性,比如继承、封装、多态,是为了实现某些思想而设计的。所以可以认为,语言和思想是相互制约,相互促进的

关系。C语言是结构化的语言,它本来就没有被设计来用于大型的程序设计,这个是和C产生的历史背景有关系的;所以才有后来

C++的产生,当然,这个是后话...

我个人觉得,嵌入式产品,C未必就比C++要弱,甚至还要更强。这个是由嵌入式产品本身的条件决定的。大多数嵌入式产品的状

况是接近系统底层,资源受限,且代码量相对来说都不大,这正是C大显身手的场合!通常代码量都不超过十万行。这个时候,用

良好的设计可以避免出现维护困难的情况,例如你说的,耦合性过大,牵一发而动全身。我觉得如果可以,重新设计一套产品的

架构,尽量的高内聚,低耦合,然后产品文档一定要齐全,科学合理的进行版本控制,应该不是很难维护

如果真的代码量很大了,那可以考虑用C++。利用面向对象的思想去组织系统。我个人觉得,C++对底层的支持不如C,C++最最强悍

的地方在于思想和库!这两个方面针对于大型或者超大型的程序来说至关重要!也是C无法比拟的
[/Quote]
也是一个哲学问题,恰到好处很难~~
angel502108 2009-08-09
  • 打赏
  • 举报
回复
很精彩,很受益……谢谢……
积极的猫咪 2009-07-28
  • 打赏
  • 举报
回复
哇,这都能吵起来??
独孤过儿 2009-07-15
  • 打赏
  • 举报
回复
我也懒得和你这种呆子废话

总以为自己有两下子,那么多OS厂商的大牛难道就不如你?还扯什么“OS是基于已有的模式,C++出现的晚,不愿意重新用C++来

写”,你不觉得这理由就像笑话一样可笑吗?

linux从2.4跨到2.6,为啥不用C++重写?

XP开发的时候,MS已经封装好了MFC了,那为什么就不用C++开发内核?XP相对于98来说,可是完全的重写啊!

vista和windows 7是完全的推倒重新开发,为啥不用C++?

在内核上,大的厂家都不用C++,而在内核之上的层面,就开始大量使用C++了,甚至都很少用C了,上世纪四大编译器厂商混战

的事,估计你都没听过吧

你还好意思强调你们的项目,标C写的东西你们用C++移植,而且还是基于已有的平台,你们觉得很伟大是不?说白了,这是弱智

都能干的工作。你们为啥不在那个没有C++编译器的平台上去写个C++的编译器呢?

听你说的话,还觉得研究通了C++的规则和编译器就一劳永逸了,你知道多重继承在各个编译器里面是怎么实现的不?你更不知道

编译器的底层实现了吧?别说你或者你们公司了,编译器连中国都不敢吹牛。OS内核和编译器这是两个衡量国家IT水平的重要标

准,我不觉得这个是简单的事。恩,可能你觉得,学过编译原理就能写编译器了啊,聚变和裂变的原理你也学过呢,你能做出来

原子弹和氢弹吗?

此贴是最后的回复,最近总遇到这些二愣子,懒得和你们废话
狐帝 2009-07-14
  • 打赏
  • 举报
回复
[Quote=引用 116 楼 fetag 的回复:]
弄清楚确实可以!但是你这样的假设有意义吗?假如有一个项目,你能赚10万块,但是你需要投入100万的本钱,你还干不干?同样,研究通了这个关系,确实可以用C++了,但是消耗的时间远远比实际收益大得多,这不是脱裤子放屁,多此一举吗?世界上没有什么事实“必须”的,只是存在一个取舍,存在一个最优!…
[/Quote]
你的意思是说,研究一下C++的对象模型需要花很大力气?以至于得不偿失?很遗憾,我没发现这一点。这些方面都有现成的资料可用,可以开始基本的研究,可以省去很大的力气。至于具体编译器相关的东西,需要研究的已经少多了,凭借通用的资料,需要的额外开销就少得多。

的确,10万的项目第一眼看上去不值得花100万去做基础研究。可是这100万花掉之后,却可能为以后的项目省掉几百万的开销,何乐而不为。当然长远收益和近期收益是需要权衡,但是你不能因此而否决这种研究,认为这是多此一举。何况,正如我前面所说,了解清楚C++的一些调用规范需要花很大的代价以至于超过OS开发的收益?我不这么认为。就拿OS开发来说,10万块钱你想开发一个很好的OS?痴人说梦!别拿linux举例说这个OS一分钱没花,这里面浸透着广大开发者的心血,价值何止千万!所以对于开发OS来说,弄清楚编译器内部的必要的细节问题是有价值的。何况,弄清楚C++调用规范需要100万吗?这两个数字倒过来说还差不多。

[Quote=引用 116 楼 fetag 的回复:]
symbian确实是用C++来写的,但是nokia是扩展了C++的特性,并且自己定制了编译器。你或者是你的公司有能量针对自己的项目自己写个编译器,那我无话可说!!!
[/Quote]
绝大多数的C++编译器都对C++语言或多或少做了些扩展,嵌入式平台尤其如此。那么就可以充分利用这些扩展进行最底层的开发。我和我的公司为什么要自己写个编译器?没必要,因为现有的编译器完全可以满足项目的需求。所以,你这个假设完全没有意义。

顺便问你一句:NOKIA扩展了C++,你知道是扩展了哪些吗?就我使用过的多种嵌入式平台的编译器来说,对于语言的扩展通常主要是为了支持对硬件的操作,比如扩展了CPU内核寄存器的关键字,比如扩展了中断服务程序修饰符关键字,等等,这些都为最底层的操作带来很大的便利。NOKIA对于C++的扩展是不是主要也是出于这两方面的考虑?这是我的臆测而已。

但是,是不是没有这种扩展就不行了?那也不见得。这样的操作完全可以用汇编语言去实现,由C/C++调用就行。所以,并不是说非得有这种扩展不可。我可以告诉你,我所从事的第一个嵌入式系统项目具有基本的OS内核的任务调度功能,就是用汇编语言和C混合编写的(我想用C++来着,可惜那个平台没有C++编译器!)。而这个项目没有用到任何编译器方言,全部是标准的C语言,后来我们的人用C++重写了一遍,移植到了另一个有C++编译器的平台上,同样没有用到任何“方言”,也没有对C/C++编译器进行很深入的了解,仅仅是看了一下官方文档里面的函数调用规范而已,没花多少精力和财力。我们也没有为此去开发一套编译器。整个项目里没有一处是“用汇编语言直接调用高级语言子程序”的。所以我一再问你,有什么必要一定要这样做?你总是顾左右而言他。回答不出了,是吗?

最后,对于我提出的问题,既然你无法回答或者是不屑于,那么我实在没兴趣在这种驴唇不对马嘴的争论上浪费时间和精力。就此告别——除非你能的下一个回复能够回答我的问题!谢谢!再见~
独孤过儿 2009-07-14
  • 打赏
  • 举报
回复
只要弄清楚C++的对象模型,完全可以用汇编调用C++的接口,没什么不可能的。只是你是否愿意去花时间研究这种事情而已。

弄清楚确实可以!但是你这样的假设有意义吗?假如有一个项目,你能赚10万块,但是你需要投入100万的本钱,你还干不干?同

样,研究通了这个关系,确实可以用C++了,但是消耗的时间远远比实际收益大得多,这不是脱裤子放屁,多此一举吗?世界上没

有什么事实“必须”的,只是存在一个取舍,存在一个最优!

Symbian在运用C++编写OS方面使用过度了,因而Symbian的内核不是好的OS内核?


symbian确实是用C++来写的,但是nokia是扩展了C++的特性,并且自己定制了编译器。你或者是你的公司有能量针对自己的项目

自己写个编译器,那我无话可说!!!
独孤过儿 2009-07-13
  • 打赏
  • 举报
回复
废话!我想说的就是两种语言不兼容,说白了吧,C++是C++,C是C,想拿C++兼容C要有个度,要有个层面

你去翻翻OS的内核,C调汇编的接口,汇编调C的接口,这样的用法比比皆是,你要是换了C++,你怎么用汇编调C++的接口?
加载更多回复(114)

69,337

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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