您的位置:首页 > 职场人生

一个C程序员的个人开发经验,抛个砖头,各位砸玉 (一)文件结构

2012-03-15 22:24 344 查看
研究生毕业7年了,虽然最近两年开发做的少了,但还时不时做一点,手还没生,写一点个人经验,希望各位大拿能交流指导一下。

打算写几个方面:

如何做好软件开发,如何学习,职业规划

一直做的是嵌入式上的C开发,所以只说C编程,以下的经验都是基于C的,其他java的,C++的都先不说了。

也没有什么系统,想到什么说什么吧。

(一) 编码经验

文件结构:

我的文件结构非常死板,假定编一个Player 模块,那么,大概会分这么几个文件。

intfPlayer.h //接口头文件,intf 是interface的意思,该文件提供给上层应用调用。

playerCommon.h //内部通用头文件,给Player模块内部各个.c 文件调用,提供公共的数据结构。

playerPlay1.c //功能实现文件1

playerPlay2.c //功能实现文件2

……………………………………..

playerPlayn.c //功能实现文件n

intfPlayer.h中通常会定义这样一些东西:

/* 基本的头文件,根据情况添加 */

#include<stdio.h>

#include<malloc.h>

#include <math.h>

#include<memory.h>

#include<string.h>

/**************************************************************************

* 常 量 *

**************************************************************************/

………………..

/**************************************************************************

* 宏定义 *

**************************************************************************/

…………………

/* 个人习惯,只是为了使用EXTERN时比extern更醒目 */

#define EXTERNextern

#define STATICstatic

#defineCONST const

………………………..

/**************************************************************************

* 数据类型 *

**************************************************************************/

/* 为了适应不同平台,也为了更醒目和方便使用,对基本数据类型重新做了定义 */

typedef char INT8;

typedef char CHAR;

typedefshort INT16;

typedef int INT32;

typedefdouble INT64;

typedef unsignedchar UINT8;

typedef unsignedshort UINT16;

typedef unsignedint UINT32;

typedef int BOOL;

typedef voidVOID;

typedef VOID* PLAYER_HANDLE;

/* 返回值 */

typedef enum

{

E_PLAYER_RTN_OK,

E_ PLAYER _RTN_NOK,

E_ PLAYER _RTN_BUTT

}E_ PLAYER _RTN;

/**************************************************************************

* 模板 *

**************************************************************************/

/**************************************************************************

* 全局变量 *

**************************************************************************/

/**************************************************************************

* 全局函数原型 *

**************************************************************************/

/* 不管什么类型的程序,我基本都这样写,创建,删除,功能执行

创建函数中会分配多块内存并初始化,删除中则释放内存。

决不会用使用一个全局性的大结构体。

*/

EXTERN E_PLAYER_RTNplCreatePlayer(PLAYER_HANDLE *hPlayHandle,...);

EXTERNE_PLAYER_RTN plPlay(PLAYER_HANDLE hPlayHandle,...);

EXTERNE_PLAYER_RTN plDeletePlayer(PLAYER_HANDLE hPlayerHandle);

playerCommon.h中通常会这样:

#include “intfPlayer.h”

/* 模块内部公共数据定义 */

playerPlay1.c等功能文件,实现各自的功能。

另外,还要写一个playerTestDriver.c,该文件中会调用各个接口函数,示范PLAYER模块的各个接口。该文件一般连同intfPlayer.h提供给应用层人员。

还有一个文件playerUnitTest.c,顾名思义,该文件完成单元测试,供开发人员自己使用,不提供给其他人。

这种文件结构很死板,但也很合理。通常各个功能文件中只引用playerCommon.h就可以了,不会再出现每个文件中都include 一堆头文件的情况,代码简洁清晰。

功能文件中多少会有些该文件才用的数据定义,我一般直接将这些定义写在该文件头部,以便减少文件个数,不再单独定义自己的专有头文件,如playerPlay1.h。除非该功能文件需要大量的数据定义,才会定义playerPlay1.h,该文件中会include playerCommon.h。

这种写法是我从之前的公司学来的,本来以为大家都这样写的,但在现在的公司,发现不同人的写法真的是丰富多彩,很多文件里include了一堆,而且往往找了半天也不知道某个模块的对外接口头文件到底是哪个,有哪些接口数据,有哪些接口函数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: