- 浏览: 985236 次
- 性别:
- 来自: 深圳
-
文章分类
最新评论
-
custjcy:
不错,赞一个。尤其是这个,在查找指定目录下,列出所有包含某个字 ...
shell命令的批量修改文件内容 -
qw173795180:
你好,请问Start这个参数怎么使用不了?
视频播放flv player的使用 -
cheeruplc:
xml进行修改之后 刷新请求 不执行 看了你的博文解决 ...
同一页面无法多次使用XmlHttp发起Ajax请求的真实原因--l转 -
dongbiying:
没有想到还有map的概念
js数组的操作及数组与字符串的相互转化 -
wangtuda:
打酱油的~
js中随机排序
在C语言的应用领域,如通讯领域和嵌入式系统领域,一个的软件项目通常包含很多复杂的功能,实现这个项目不 是一个程序员单枪匹马可以胜任的,往往需要一个团队的有效合作,另外,在一个以C代码为主的完整的项目中,经常也需要加入一些其他语言的代码,例如,C代 码和汇编代码的混合使用,C文件和C++的同时使用。这些都增加了一个软件项目的复杂程度,为了提高软件质量,合理组织的各种代码和文件是非常重要的。
组织代码和文件的目的是为了使团队合作更加有效,使软件项目有良好的可扩展性、可维护性、可移植性、可裁减、可测试性,防止错误发生,提高软件的稳定性。 通常情况下,软件项目采用层次化结构和模块化开发的方法,例如,一个嵌入式软件项目可能有驱动层,操作系统层,功能层,应用程序层,每一个层使用它的下层 提供的接口,并为它的上层提供调用接口,模块则是每一个层中完成一个功能的单元,例如驱动层的每一个设备的驱动就是一个模块,应用层的每个应用程序就是一 个模块,模块使用下层提供的接口和同层其他模块提供的接口,完成特定功能,为上层和同层的其他模块提供调用接口。
这里的接口是指一个功能模块暴露出来的,提供给其他模块的访问具体功能的方法。根据C语言的特点,使用*.c文件实现模块的功能,使用*.h文件暴露单元 的接口,在*.h文件里声明外部其他模块可能是用的函数,数据类型,全局变量,类型定义,宏定义和常量定义.外部模块只需包含*.h文件就可以使用相应的 功能.当然,模块可以在细化为子模块.虽然我们这里说的接口和COM(通用组件模型)里定义的接口不同,但是,根据COM里对接口的讨论,为了使软件在修 改时,一个模块的修改不会影响到其他模块的一个模块的修改不会导致其他模块也需要修改,所以,接口第一次发布后,修改*.h文件不能导致使用这个接口的其 他模块需要重新编写.
根据C语言的特点,并借鉴一些成熟软件项目代码,总结C项目中代码文件组织的基本建议:
1,使用层次化和模块化的软件开发模型.每一个模块只能使用所在层和下一层模块提供的接口.
2,每个模块的文件包存在独立的一个文件夹中.通常情况下,实现一个模块的文件不止一个,这些相关的文件应该保存在一个文件夹中.
3,用于模块裁减的条件编译宏保存在一个独立的文件里,便于软件裁减.
4,硬件相关代码和操作系统相关代码与纯C代码相对独立保存,以便于软件移植.
5,声明和定义分开,使用*.h文件暴露模块需要提供给外部的函数,宏,类型,常量,全局变量,尽量做到模块对外部透明,用户在使用模块功能时不需要了解具体的实现,文件一旦发布,要修改一定要很慎重,
6,文件夹和文件命名要能够反映出模块的功能.
7,正式版本和测试版本使用统一文件,使用宏控制是否产生测试输出。
8,必要的注释不可缺少。
理想的情况下,一个可执行的模块提供一个公开的接口,即使用一个*.h文件暴露接口,但是,有时候,一个模块需要提供不止一个接口,这时,就要为每个定义 的接口提供一个公开的接口。在C语言的里,每个C文件是一个模块,头文件为使用这个模块的用户提供接口,用户只要包含相应的头文件就可以使用在这个头文件 中暴露的接口。所有的头文件都建议参考以下的规则:
1, 头文件中不能有可执行代码,也不能有数据的定义,只能有宏、类型(typedef,struct,union,menu),数据和函数的声明。例如以下的代码可以包含在头文件里:
- #define NAMESTRING “name”
- typedef unsign long word;
- menu{
- flag1;
- flag2;
- };
- typedef struct{
- int x;
- int y;
- } Piont;
- extent Fun(void);
- extent int a;
-
int a;
- void Fun1(void)
- {
- a++;
- }
3,含一些需要使用的声明。在头文件里声明外部需要使用的数据,函数,宏,类型。
4,防止被重复包含。使用下面的宏防止一个头文件被重复包含。
#ifndef MY_INCLUDE_H
#define MY_INCLUDE_H
<头文件内容>
#endif
5,包含extern "C",使的程序可以在C++编译器被编译
#ifdef __cplusplus
extern "C"{
#endif
<函数声明>
#ifdef __cplusplus
}
#enfif
被extern "C"修饰的变量和函数是按照C语言方式编译和连接的;未加extern “C”声明时的编译方式,作为一种面向对象的语言,C++支持函数重载,而过程式语言C则不支持。函数被C++编译后在符号库中的名字与C语言的不同。例如,假设某个函数的原型为:
void foo( int x, int y );该函数被C编译器编译后在符号库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字(不同的编译器可能生成的名字不同,但是都采用了相同的机制,生成的新名字称为“mangled name”)。_foo_int_int这样的名字包含了函数名、函数参数数量及类型信息,C++就是靠这种机制来实现函数重载的。例如,在C++中,函数void foo( int x, int y )与void foo( int x, float y )编译生成的符号是不相同的,后者为_foo_int_float。 同样地,C++中的变量除支持局部变量外,还支持类成员变量和全局变量。用户所编写 程序的类成员变量可能与全局变量同名,我们以"."来区分。而本质上,编译器在进行编译时,与函数的处理相似,也为类中的变量取了一个独一无二的名字,这 个名字与用户程序中同名的全局变量名字不同。加extern "C"声明后的编译和连接,强制C++连接器按照C编译器产生的符号_foo链接。
6,保证在使用这个头文件时,用户不用再包含使用此头文件的其他前提头文件,即要使用的头文件已经包含在此头文件里。例如:area.h头文件包含了面积 相关的操作,要使用这个头文件不需同时包含了关于点操作的头文件piont.h。用户在使用area.h时不需要手动包含piont.h,因为我们已经在 area.h中用#include “point.h”包含了这个头文件。
有一些头文件是为用户提供调用接口,这种头文件中声明了模块中需要给其他模块使用的函数和数据,鉴于软件质量上的考虑,处理参考以上的规则,用来暴露接口的头文件还需要参考更多的规则:
1,一个模块一个接口,不能几个模块用一个接口。
2,文件名为和实现模块的c文件相同。abc.c--abc.h
3,尽量不要使用extern来声明一些共享的数据。因为这种做法是不安全的,外部其他模块的用户可能不能完全理解这些变量的含义,最好提供函数访问这些变量。
4,尽量避免包含其他的头文件,除非这些头文件是独立存在的。这一点的意思是,在作为接口的头文件中,尽量不要包含其他模块的那些暴露*.C文件中内容的头文件,但是可以包好一些不是用来暴露接口的头文件。
5,不要包含那些只有在可执行文件中才使用的头文件,这些头文件应该在*.c文件中包含。这一点如同上一点,为了提高接口的独立性和透明度。
6,接口文件要有面向用户的充足的注释。从应用角度描述个暴露的内容。
7,接口文件在发布后尽量避免修改,即使修改也要保证不影响用户程序。
多个代码文件使用一个接口文件:这种头文件用于那些认为一个模块使用一个文件太大的情况。对于这种情况对于这种情况在参考上述建议后,也要参考以下建议。
1,多个代码文件组成的一个模块只有一个接口文件。因为这些文件完成的是一个模块。
2,使用模块下文件命名<系统名><模块名命名>
3,不要滥用这种文件。
4,有时候也会出现几个*.c文件用于共向数据的*.h文件,这种文件的特点是在一个*.c文件里定义全局变量,而在其他*.c文件里使用,要将这种文件和用于暴露模块接口的文件区别。
5,一个模块如果有几个子模块,可以用一个*.h文件暴露接口,在这个文件里用#include包含每个子模块的接口文件。
还有一种头文件,说明性头文件,这种头文件不需要有一个对应的代码文件,在这种文件里大多包含了大量的宏定义,没有暴露的数据变量和函数。这些文件给出以下建议:
1,包含一些需要的概念性的东西.
2,命名方式,定义的功能.h
3,不包含任何其他的头文件.
4,不定义任何类型.
5,不包含任何数据和函数声明.
上面介绍了C头文件的一些建议,下面介绍C代码文件*.c文件的一些建议,*.c文件是C语言中生成汇编代码和机器码的内容,要注意以下建议:
1.命名方式 模块名.c
2,用static修饰本地的数据和函数。
3,不要使用external。这是在*.h中使用的,可以被包含进来。
4,无论什么时候定义内部的对象,确保独立与其他执行文件。
5,这个文件里必须包含相应功能函数。
上面介绍了一些C文件组织的建议,用于提高C语言项目的质量,在以后的C项目组织中,学习面向对象和COM的思想,将这些思想加入到C程序中,能够写出更 高质量的代码。上面的建议在具体的项目里应该灵活运用,附录里有*.h头文件和*.c代码文件的模版,在工程中可以作为参考。另外,C工程中经常有一些汇 编代码文件,这些文件也要使有*.h头文件暴露其中的数据和函数,以便其他*.c文件包含使用
发表评论
-
防火墙实现URL过滤原理
2014-05-08 18:45 4411对于URL过滤:1.HTTP URL过滤 2.https UR ... -
解决webserver在IE下载文件,文件名为乱码问题
2013-12-28 16:26 1451通常使用以下代码就能导出为流的文件,而不是打开文件 w ... -
C实现urlencode&urldecode
2013-12-28 16:20 6031static unsigned char char_to_he ... -
c语言实现urlencode
2013-12-28 16:19 2074#include <stdio.h> #inc ... -
wifidog+authpuppy认证页面的配置
2013-10-29 02:15 3466转自:http://blog.sina.com.cn/s/ ... -
atoi() & itoa()&atol()<oa()函数的实现
2013-05-01 13:53 3097#include "stdio.h" ... -
详解sigaction --转
2013-04-20 03:31 11403详解sigaction 这是挺好理解的,就好比在系 ... -
Linux定时器的使用 --转
2013-04-20 01:13 1481使用定时器的目的无非是为了周期性的执行某一任务,或者是到了 ... -
Linux C 函数参考(日期时间) --转
2013-04-20 00:03 11483Linux C 函数参考(日期时间) 1.1 概述 世 ... -
对(*(volatile unsigned long *)) 的理解
2013-03-20 15:10 1576对(*(volatile unsign ... -
Linux内核模块概述 --转
2013-01-08 10:43 2475Linux内核模块概述 . Linux 内 ... -
linux上搭建pppoe-server
2012-12-28 15:53 8923记录下过程,主要还是参 ... -
Ubuntu上架设PPPoE Server--转
2012-12-28 01:25 7569一。安裝 PPPoE Server Software ... -
移植rp-pppoe到s3c2440实现ADSL拨号上网--转
2012-12-28 01:22 3271一:总的来说可以分 ... -
Linux下C语言实现文件拷贝--转
2012-11-01 23:11 14044Linux下C语言实现文件拷贝 /* Func ... -
linux操作系统的DNS客户端配置
2012-09-16 16:52 11405基于linux操作系统的DNS客户端配置: Linux ... -
/etc/hosts配置文件解析
2012-06-20 14:46 2581/etc/hosts配置文件解析 这个文件可以配置主机ip及 ... -
移殖net-snmp和应用net-snmp开发详解 -转
2012-06-08 17:46 3619移殖net-snmp和应用net-snmp开发详解 @ ... -
strtok 和strtok_r 的使用
2012-06-01 17:13 106901. strtok介绍众所周知,strtok可以根据用户所提供 ... -
关于LINUX C中函数strtok使用要点
2012-06-01 15:45 2286strtok函数的使用是一个老生常谈的问题了。该函数的作用很大 ...
相关推荐
首先,体系结构描述语言主要用于描述软件的高级结构和组织方式,而程序设计语言则关注具体的实现细节。ADLs强调的是软件组件的组织、交互以及它们之间的关系,这包括组件的接口、连接器和整体的系统结构。例如,一个...
树结构组件在小程序中广泛应用,如文件管理系统、组织架构展示、导航菜单等。通过自定义组件,开发者可以灵活地调整样式和功能,以满足特定需求。 总结,小程序中的自定义树结构组件涉及到数据结构、组件化开发、...
总的来说,"数据结构C语言程序"这个主题涵盖了大量计算机科学的基础知识,不仅有助于提升编程技能,也是进入更高级计算机领域如操作系统、编译原理等的基石。通过学习和实践,你可以构建起强大的问题解决能力,并为...
C语言的程序结构通常包括主函数、其他函数、注释和头文件。一个C程序可以由多个函数组成,但只有一个主函数,即程序的起点。例如,一个简单的C程序可能用于计算输入数值的正弦值,它包含了输入输出、数学运算等功能...
程序有三种基本结构:顺序结构、分支结构和循环结构。 1. **顺序结构**:这是最简单的编程结构,程序中的指令按照它们在代码中出现的顺序逐行执行。在生成多孔材料结构时,这可能涉及到初始化变量、定义参数(如...
总结来说,结构化程序设计风格是一种强调程序结构清晰、易读性强的编程范式。通过自顶向下、逐步求精的设计方法,以及模块化和控制结构的使用,它能够帮助开发者更好地组织和管理代码,提高软件的质量和可靠性。在...
在Rust编程语言中,构建项目时,正确的目录结构至关重要,因为它有助于代码组织和模块化。本示例探讨了一个Rust程序的典型目录结构,以及如何在不同文件之间进行引用和调用。我们将重点关注`mod`,`crate`,`self`和...
这种组织结构有助于清晰地区分各个层次的功能,提高了代码的可读性和可维护性。 #### 四、MVC项目模板 - **创建新项目**:Visual Studio提供了创建新的ASP.NET MVC Web应用程序的项目模板。通过这个模板,开发者...
综上所述,数据结构与程序的关系体现在数据的组织、信息的传递、系统的运行流程、错误处理和安全措施等方面,它们共同构建了一个高效、稳定且安全的定票/领票系统。合理的设计和实施这些环节对于优化系统性能和用户...
《C++数据结构与程序设计》作为一部计算机科学与工程领域的基础性核心课程著作,专注于C++语言环境下数据结构与算法的教学与应用。这本书在内容实用性、编写体例和结构布局方面都显示出其独到之处,不仅适合高校师生...
数据结构是计算机科学中的核心概念,它涉及到如何有效地组织、存储和检索数据。在这个名为“数据结构经典程序”的压缩包中,我们很可能会找到一系列与数据结构相关的编程实践示例,包括基本操作如单位加、文件处理...
程序设计与数据结构是计算机科学中的基础学科,它不仅涉及编程技术的掌握,还涉及到如何高效组织和处理数据的问题。良好的程序设计能力能够帮助开发者编写出逻辑清晰、结构合理、易于维护的代码,而合理运用数据结构...
这些小程序旨在简化复杂的工程计算过程,提高工作效率,确保结构设计的安全性和合理性。以下是对这些计算小程序的详细介绍: 1. **混凝土结构计算**:这些小程序涵盖了混凝土结构设计的基本计算,如梁、柱、板的...
【结构性测试】是一种重要的软件测试方法,旨在通过深入分析程序的内部结构来设计测试用例。在武汉理工大学的软件测试实验二中,学生需要掌握结构性测试技术并运用这些技术来设计有效的测试用例。 首先,实验要求...
在这个网络拓扑结构绘制程序中,MFC被用来创建用户界面,管理图形元素的绘制和交互,使得程序具有良好的可扩展性,可以添加更多功能或自定义模块。 网络拓扑结构绘制程序的功能通常包括以下几点: 1. **图形化界面...
结构化程序设计的优点是执行效率高、开发难度低,但缺点是软件的可重用性低。 面向对象程序设计是基于信息隐藏和抽象数据类型的概念,数据抽象指的是一个数据结构以及作用在该结构上的操作所组成的一个实体,数据...
由于提供的信息中不包含具体的文章内容,无法直接从给定的文件中提取知识点。但是根据标题、描述以及标签,我们可以...如果书籍中包含图形和代码示例,那将有助于更好地理解ARM汇编语言及其程序设计的复杂性和实用性。
数据结构是计算机科学中的核心概念,它涉及到如何在内存中高效地组织和管理数据,以便进行各种计算和操作。在程序设计中,理解和熟练运用数据结构对于优化算法和提升程序性能至关重要。本压缩包文件“数据结构程序”...
组织结构设计的程序主要包括五个步骤: 1. **分析影响因素**:企业环境、规划、战略目标和信息沟通是决定组织结构的关键因素。企业环境的分析包括市场条件、竞争态势和技术革新等;规划涉及企业的长期发展方向和...
4. **单入口单出口**:每个函数或模块只有一个开始点和结束点,避免了复杂的控制流,增强了程序的结构性。 5. **主程序员组**:在软件开发过程中,采用主程序员负责制,由一位主程序员协调整个团队的工作,确保设计...