当前位置:首页 » 编程语言 » c语言重构

c语言重构

发布时间: 2022-09-27 05:49:04

c语言编程技术的优势和劣势

随着互联网编程技术的不断发展,现在大多数的软件开发都是通过编程语言来实现的,今天我们就一起来了解一下C语言编程开发技术都有哪些优势和劣势。



C语言的一些好的体验


一次通过阅读POV-Ray源代码学会如何在C语言中实现面向对象编程。


通过阅读GTK+源代码了解C语言代码的清晰、干净和可维护性。


通过阅读SIOD和Guile的源代码,知道如何使用C语言实现Scheme解析器。


使用C语言写出GNOMEEye的初始版本,并对MicroTile渲染进行调优。


C语言的一些不好的体验


在Evolution团队时,很多东西老是崩溃。那个时候还没有Valgrind,为了得到Purify这个软件,需要购买一台Solaris机器。


调试gnome-vfs线程死锁问题。


调试Mesa,却无果。


接手Nautilus-share的初始版本,却发现代码里面居然没有使用free()。


想要重构代码,却不知道该如何管理好内存。


想要打包代码,却发现到处是全局变量,而且没有静态函数。


但不管怎样,还是来说说那些Rust里有但C语言里没有的东西吧。


自动资源管理


Rust从C++那里借鉴了一些想法,如RAII(,资源获取即初始化)和智能指针,并加入了值的单一所有权原则,还提供了自动化的决策性资源管理机制。


自动化:不需要手动调用free()。内存使用完后会自动释放,文件使用完后会自动关闭,互斥锁在作用域之外会自动释放。如果要封装外部资源,基本上只要实现Drop这个trait就可以了。封装过的资源就像是编程语言的一部分,因为你不需要去管理它的生命周期。


决策性:资源被创建(内存分配、初始化、打开文件等),然后在作用域之外被销毁。根本不存在垃圾收集这回事:代码执行完就都结束了。程序数据的生命周期看起来就像是函数调用树。


如果在写代码时老是忘记调用这些方法(free/close/destroy),或者发现以前写的代码已经忘记调用,甚至错误地调用,那么以后我再也不想使用这些方法了。


泛型


Vec真的就是元素T的vector,而不只是对象指针的数组。在经过编译之后,它只能用来存放类型T的对象。


在C语言里需要些很多代码才能实现类似的功能,所以我不想再这么干了。


trait不只是interface


Rust并不是一门类似那样的面向对象编程语言,它有trait,看起来就像是里的interface——可以用来实现动态绑定。如果一个对象实现了Drawable,那么就可以肯定该对象带有draw()方法。


不过不管怎样,trait的威力可不止这些。


依赖管理


以前实现依赖管理需要:


手动调用或通过自动化工具宏来调用g-config。


指定头文件和库文件路径。


基本上需要人为确保安装了正确版本的库文件。


而在Rust里,只需要编写一个Cargo.toml文件,然后在文件里指明依赖库的版本。这些依赖库会被自动下载下来,或者从某个指定的地方获取。


测试


C语言的单元测试非常困难,原因如下:


内部函数通常都是静态的。也就是说,它们无法被外部文件调用。测试程序需要使用#include指令把源文件包含进来,或者使用#ifdefs在测试过程中移除这些静态函数。


需要编写Makefile文件将测试程序链接到其中的部分依赖库或部分代码。


需要使用测试框架,并把测试用例注册到框架上,还要学会如何使用这些框架。


卫生宏(HygienicMacro)


Rust的卫生宏避免了C语言宏可能存在的问题,比如宏中的一些东西会掩盖掉代码里的标识符。Rust并不要求宏中所有的符号都必须使用括号,比如max(5+3,4)。


没有自动转型


在C语言里,昆明北大青鸟http://www.kmbdqn.cn/发现很多bug都是因为在无意中将int转成short或char而导致,而在Rust里就不会出现这种情况,因为它要求显示转型。


不会出现整型溢出


这个就不用再多作解释了。


㈡ Qt通过TCP发送的结构体如何能被使用C语言写

你应该是发送结构体里的数据吧。可以读出来生成jason格式的字符串发送就好。接收端再用jason格式的解析器解析再生成结构体对象。c++写的jason格式生成和解析的开源库很多可以网上查。

㈢ 华为c语言编程规范是怎样的

代码总体原则
清晰第一。清晰性是易于维护、易于重构的程序必须具备的特征。
简洁为美。简介就是易于理解并且易于实现。
选择合适的风格,与源代码风格保持一致。
头文件
头文件的设计体现了大部分的系统设计,不合理的头文件布局是编译时间过长的根因,实际上是不合理的设计。
头文件中适合放置接口的声明,不适合放置实现。
头文件应当职责单一。
头文件应向稳定的方向包含。
每一个.c文件应有一个同名的.h文件,用于声明需要对外公开的接口。
禁止头文件循环依赖。
禁止包含用不到的头文件。
头文件应当自包含。
编写内部#include保护符(#define保护)。
禁止在头文件中定义变量。
只能通过包含头文件的方式使用其他C提供的接口,禁止在C中通过extern的方式使用外部函数接口和变量。
禁止在extern "C"中包含头文件。
函数
函数设计的精髓:编写整洁函数,同事把代码有效组织起来。
一个函数仅完成一个功能。
重复代码应该尽可能提炼成函数。
避免函数过长,新增函数不超过50行。
避免函数的代码块嵌套过深,新增函数的代码块嵌套不超过4层。
可重入函数应避免使用共享变量;若需要使用,则应该通过互斥手段对其加以保护。
对参数的合法性检查,由调用者负责还是接口函数负责,应在项目组模块内统一规定。缺省由调用者负责。
对函数的错误返回码要全面处理。
设计高扇入,合理扇出(小于7)的函数。扇出是指调用其它函数的数目。扇入是指有多少上级函数调用它。
废弃代码要及时清除。
函数参数不变使用const限定。
函数应避免使用全局变量、静态局部变量和I/O操作,不可避免的地方应集中使用。
检查函数所有非参数输入的有效性,如数据文件、公共变量等。
函数的参数个数不超过5个。
在源文件范围内声明和定义的所有函数,除非外部可见,否则应该加static关键字。
标识符
标识符的命名要清晰、明了,有明确含义,同时使用完整的单词或大家基本可以理解的缩写,避免使人产生误解。
产品、项目组内应保持同意的命名分格。
尽量避免名字中出现数字编号,除非逻辑上确实需要。
重构、修改部分代码时,应该保持和原有代码风格一致。
文件命令统一采用小写字符。因为不同系统对文件名大小写处理会有不同(windows不区分大小写,但是linux系统则区分)。
全局变量应增加“g_”前缀。
静态变量应增加“s_”前缀。
禁止使用单字节命名变量,但是允许定义i,j,k作为局部循环变量。
不建议使用匈牙利命名法。
对于数值或者字符串常量的定义,建议采用全大写字母,单词之间加下划线的方式命名。
变量
结构功能单一,不要设计面面俱到的数据结构。
不用或者少用全局变量
防止局部变量与全局变量同名
通讯过程中使用的机构,必须注意字节序。
严禁使用未经初始化的变量作为右值。
使用面向接口编程思想,通过API访问数据。
尽量减少没有必要的数据类型默认转换与强制转换。
宏和常量
用宏定义表达式时,要使用完备的括号。
将宏定义的多条表达式放在大括号中。
使用宏时,不允许参数发生变化。
不允许直接使用魔鬼数字。
除非必要,应尽可能使用函数代替宏。
常量建议用const定义代替宏。
质量
时刻注意易混淆的操作符
必须了解编译系统的内存分配方式,特别是编译系统对不同类型的变量的内存分配规则,如局部变量在何处分配、静态变量在何处分配等。
不仅关注接口,同样要关注实现。
禁止内存操作越界。
禁止内存泄漏。
禁止引用已经释放的内存空间。
编程时,要防止差1错误。
switch语句必须有default分支。
函数中分配的内存,在函数退出之前要释放。
不要滥用goto语句。
时刻注意表达式是否会上溢、下溢。
程序效率
在保证软件系统的正确性、简洁、可维护性、可靠性及可测试性的前提下,提高代码的效率。
通过对数据结构、程序算法的优化来提高效率。
将不变条件的计算移到循环体外。
对于多维大数组,避免来回跳跃式访问数组成员。
创建资源库,以减少分配对象的开销。
将多次被调用的“小函数”改为inline函数或者宏实现。
注释
优秀的代码可以自我解释,不通过注释即可轻易读懂。
注释的内容要清楚、明了,含义准确,防止注释二义性。
修改代码时,维护代码周边的所有注释,以保证注释与代码的一致性。不再有用的注释要删除。
文件头部应进行注释,注释需要列出:版权说明、版本号、生成日期、作者姓名、工号、内容、功能说明、与其他文件的关系、修改日志等,头文件的注释中还应有函数功能的说明。
函数声明处注释描述函数功能、性能及用法,包括输入和输出参数、函数返回值、可重入的要求等;定义处详细描述函数功能和实现要点,如实现的简要步骤、实现的理由、设计约束等。
全局变量要有详细的注释,包括对其功能、取值范围以及存取时注意事项等的说明。
尽量采用工具可以识别的格式注释。
排版与格式
程序块采用缩进风格编写,每级缩进为4个空格。
相对独立的程序块之间、变量说明之后必须加空行。
一行只写一条语句。
对等操作两边加空格,注释符与内容之间加空格。
编译
使用编译器的最高告警级别,理解所有的告警,通过修改代码而不是降低告警级别来消除所有告警。
在产品软件中,要统一编译开关、静态检查选项以及相应告警清除策略。
可测性
模块划分清晰,接口明确,耦合性小,有明确输入和输出,否则单元测试实施困难。
在统一项目组或产品组内,调测打印的日志要有统一的规定。
使用断言记录内部假设。
不能用断言来检查运行时错误。

㈣ 如何重构这个switch语句

C语言还提供了多分支选择的switch语句, 形式为:
switch(表达式){
case 常量表达式1: 语句1;
case 常量表达式2: 语句2;

case 常量表达式n: 语句n;
default: 语句n+1;
}
其语义是:计算表达式的值。 逐个与其后的常量表达式值相比较,当表达式的值与某个常量表达式的值相等时, 即执行其后的语句,不再进行判断,继续执行后面所有case后的语句。表达式的值与所有case后的常量表达式均不相同时,则执行default后的语句。
在使用switch语句时还应注意以下几点:

在case后的各常量表达式的值不能相同,否则会出现错误。

在case后,允许有多个语句,可以不用{}括起来。

各case和default子句的先后顺序可以变动,而不会影响程序执行结果。

default子句可以省略不用。

㈤ c语言重构是什么意思,能举一个具体的例子吗,他和重构有什么区别啊

亲,你说的是函数重载吧?
重构是指代码重构,就是重新写代码,因为前面写过一次,所以再写的时候可能会有更好的想法,就像做作业检查一样。
函数重载是指函数名一样,参数不一样,即为函数重载:
int func(int a){....},int func(char *p){....}和int func(int *p){....}都是它的重载函数
不知道你明白没有

㈥ c语言是有什么

C语言是一种通用的、面向过程式的计算机程序设计语言。1972 年,为了移植与开发 UNIX 操作系统,丹尼斯·里奇在贝尔电话实验室设计开发了 C 语言。

C 语言是一种广泛使用的计算机语言,它与 Java 编程语言一样普及,二者在现代软件程序员之间都得到广泛使用。

C语言简单例子:

(6)c语言重构扩展阅读:

结构式语言的显着特点是代码及数据的分隔化,即程序的各个部分除了必要的信息交流外彼此独立。这种结构化方式可使程序层次清晰,便于使用、维护以及调试。

C 语言是以函数形式提供给用户的,这些函数可方便的调用,并具有多种循环、条件语句控制程序流向,从而使程序完全结构化。

㈦ 大一学习c语言快一学期了,准备在寒假里面好好再深度学习一下,可是不知道该看哪些书,求推荐!

和其它语言作比较,C语言是一个相对较小的语言,它可以在相对较短的时间内学会。但由于C语言表达能力强,细节太多,很难掌握它。想要掌握C语言我认为应该读经典名着,只阅读经典名着。然后看看好的源代码。还有学习软件设计,并应用于日常编程。C语言是几本经典的书,不需要花很多时间去看它。语言的优点和缺点更像是一种信念,而不是太多的讨论,而且大多数编程原则都适用于任何语言。


当然,其实我比较建议你动手写大量你喜欢的的程序,并选择寻找问题和解决问题的书籍。国外非计算机专业的大学课程学习C都要求动手写过3千行以上代码,老师也没推荐过任何书,倒是要求动手写代码。我想如果你喜欢C语言编程,你不应该错过动手实践。

㈧ 编程必须明确清楚这几点,学习C语言和C++

一、宏观:
将C++视为C、面向对象C++、模版C++、STL C++组成的语言联邦。
任何人不得添加任何东西到STL命名空间
不要轻易忽略编译器的警告
一定程度的使用测试驱动的开发方法
软件实体(类、模块、函数)应该是可扩展的,但是不可修改的
多采用敏捷的设计方法(个体和交互胜过过程和工具、可以工作的软件胜过面面俱到的文档、客户合作胜过合同谈判、响应变化胜过遵循计划)
经常性的交付可以工作的软件,交付的时间间隔越短越好
在整个项目开发期间,业务人员和开发人员必须天天都在一起工作
围绕被激励起来的个人来构建项目
在团队内部,多进行面对面的交流
提倡可持续的开发速度
使要构造的系统最简单(不要设计不需要的功能,不要过分设计)
最好的架构、需求和设计出自于自组织团队
每隔一段时间,团队会在如何才能更有效的工作方面进行反省,然后相应的对自己的行为进行调整
结对编程是一种比较好的选择
不能容忍重复的代码
持续的对代码进行重构
要做计划游戏
高层模块不应该依赖于底层模块。二者都应该依赖于抽象
尽可能的保证:抽象不应该依赖于细节,细节应该依赖于抽象(任何变量都不应该持有一个指向具体类的指针或引用;任何类都不应该从具体类派生;任何方法都不应该覆写它的任何基类中已经实现了的方法)
每个编程单元尽可能的向使用者提供使用承诺:例如资源回收保证、数据一致性保证、无异常保证
尽可能的在程序中处理所有可能的异常,而且尽可能的精细。(try...catch)
应该让程序体面的退出:在出现非计划内问题时自动产生mp文件。(利用SetUnhandledExceptionFilter调用MiniDumpWriteDump)
要先设计好类,建好各个类的文件,才能写代码。
用pragma once代替h文件头
二、类:
让接口容易被正确使用,不易被误用
设计class犹如设计type
将成员变量声明为private
尽量不要让类支持隐式类型转换
friend成员函数是类接口的一种表现方式,但能避免使用就尽量避免
避免使用handles指向对象内部成分
慎重使用inline(小函数的确该用inline,但是考虑到inline函数无法调试,所以应谨慎)
确定public继承表现出is-a关系(即Liskov替换原则,永远可以用派生类取代基类)
避免覆盖继承而来的名称(基类函数重载,派生不重载,则其他覆盖;派生重载基类函数,则基类函数覆盖;变量也可以覆盖)
区别接口继承和实现继承(纯接口(virtual=0),接口+朴素实现(virtual=0+实现),接口+强制实现(non-virtual),以上为public继承,private继承全部是为了继承实现,而不继承接口)
根据上一条,只要出现virtual,就尽可能让它=0(成虚基类)
根据上上条,派生类不应该覆写non-virtual函数
绝不重新定义继承而来的缺省参数值
private继承意味着继承实现,是composition,实现的是has-a逻辑。protected继承尽量少用。两种继承在设计层面完全没有意义,只是实现层面的代码重用。
凡是独立的对象都必须有非0大小(空对象会安插一个char)
一个类只负责一件事
一个类只提供一种内聚的接口(不应该让用户依赖于他们不使用的方法)
类内部的类型定义尽量放在public,否则不能作为返回值
类中的大属性都应该用智能指针(或返回STL时应使用move语意)
凡是类内私有变量加m前缀,凡事类似私有仿函数,加or后缀
静态成员初始化函数用静态类替代,可以顺便用个functor
四大函数(构造函数、拷贝构造、赋值、析构)
若有多态继承体系,基类析构函数尽量声明为virtual
如果类内new了对象,并且该类负责delete,则必须要定义拷贝构造函数和赋值操作符。
若不想使用编译器自动生成的函数,就该默认拒绝(将其声明在private或protected)
别让异常逃离析构函数,C++不喜欢析构函数吐出异常
绝不在构造函数或析构函数中调用virtual函数(当然其他函数调用virtual可以实现template method等有趣的模式)
拷贝函数应该确保拷贝了对象内所有成员和基类部分
不要以某个拷贝函数去实现另外一个拷贝函数(一个是函数,一个是 assignment函数),应该把共同部分放在第三个独立函数
三、函数:
尽量将函数参数声明为const
另operator =返回一个*this的引用,并且在operator =中处理自我赋值
函数参数的构造顺序不确定,所以不要在函数参数中执行new操作,或将多个函数参数都用函数来表示(否则若一个发生异常,其他有可能不会执行)。
尽量用传递const 引用代替传值
non-member,none-friend函数有封装性好,跨类型操作等能力,因此在需要的时候没有必要局限于把函数全部放到类里的传统规则。
若所有参数都需要类型转换,请为此采用non-memeber函数(典型的是双目操作符重载)
凡是需要对指针参数做提领操作,都需要检查是否为BULL
发布版程序维持程序的勉强工作比crash更好;debug版让程序尽量crash。
希望可以帮到你,谢谢!

㈨ 想买C语言的书,看到豆瓣网《重构》分数比较高!是国内人写的,对国内的软件书记我不抱信心!该不该买呢

absolutely not!推荐国外优秀书籍《C Primer Plus》,超级经典,内容太棒了,有中文版。

㈩ c语言是干嘛的

C语言是用来编写系统的。
最开始,人们手里除了机器码就是汇编,没有别的语言。但是汇编有很多硬件相关的特性,可移植性差。贝尔实验室要解决这一问题,就研发了C语言。
C语言可以跨平台,一份代码,配上不同的编译器就可以在各大电脑上运行。除此之外,C语言效率惊人,在某些情况中,如果汇编水平中等以下,编出来的汇编甚至没有C语言生成的机器码快。
现在,NOIP(现更名为CSP-J和CSP-S)仅允许初赛和复赛使用三种语言:Pascal、C、C++,C语言的重要性不言而喻。

虽然迈入了互联网时代,但是C语言的地位也没有低到可以忽略。C语言在对空间和时间要求较高的设备(如嵌入式设备)中发挥着重要功能,也可以编写各大语言的编译器,有着比较重要的地位。

热点内容
希望之村好友服务器怎么邀请好友 发布:2024-12-27 20:38:05 浏览:87
搭建手机街机服务器 发布:2024-12-27 20:35:11 浏览:234
esmtp验证密码是什么 发布:2024-12-27 20:32:12 浏览:782
当兵可以使用什么安卓手机 发布:2024-12-27 20:31:24 浏览:756
如何让手机的密码改成人脸识别 发布:2024-12-27 20:25:49 浏览:711
vsftpdftp 发布:2024-12-27 20:13:31 浏览:474
dns和dhcp服务器怎么配置 发布:2024-12-27 20:06:24 浏览:162
蹦极是怎么解压的 发布:2024-12-27 20:06:07 浏览:941
热血传奇搭建服务器 发布:2024-12-27 20:00:16 浏览:271
sql查看表的索引 发布:2024-12-27 19:47:50 浏览:692