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

研究生毕业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了一堆,而且往往找了半天也不知道某个模块的对外接口头文件到底是哪个,有哪些接口数据,有哪些接口函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值