目录

什么是好的程序员

  1、有专研精神,勤学善问、举一反三。
  2、积极向上的态度,有创造性思维。
  3、与人积极交流沟通的能力,有团队精神。
  4、谦虚谨慎,戒骄戒燥。
  5、写出的代码质量高。包括:代码的稳定、易读、规范、易维护、专业。

c/C++ 编程好的修养

01、版权和版本
02、缩进、空格、换行、空行、对齐
03、程序注释
04、函数的[in][out]参数
05、对系统调用的返回进行判断
06、if 语句对出错的处理
07、头文件中的#ifndef
08、在堆上分配内存
09、变量的初始化
10、h和c文件的使用
11、出错信息的处理
12、常用函数和循环语句中的被计算量
13、函数名和变量名的命名
14、函数的传值和传指针
15、修改别人程序的修养
16、把相同或近乎相同的代码形成函数和宏
17、表达式中的括号
18、函数参数中的const
19、函数的参数个数
20、函数的返回类型,不要省略
21、goto语句的使用
22、宏的使用
23、static的使用
24、函数中的代码尺寸
25、typedef的使用
26、为常量声明宏
27、不要为宏定义加分号
28、||和&&的语句执行顺序
29、尽量用for而不是while做循环
30、请sizeof类型而不是变量
31、不要忽略Warning
32、书写Debug版和Release版的程序

文件头注释

/************************************************************************
*
*   文件名:network.c
*
*   文件描述:网络通讯函数集
*
*   创建人: Hao Chen, 2003年2月3日
*
*   版本号:1.0
*
*   修改记录:
*
************************************************************************/

函数注释

/*================================================================
 *
 * 函 数 名:XXX
 *
 * 参    数:
 * 
 *        type name [IN] : descripts
 *
 * 功能描述:
 * 
 *        ..............
 *
 * 返 回 值:成功TRUE,失败FALSE
 *
 * 抛出异常:
 *
 * 作    者:ChenHao 2003/4/2
 *
 ================================================================*/

编程风格

// 语句中要在各个操作符间加空格,函数调用时,要以各个参数间加空格。如下面这种加空格的和不加的
for ( i = 0 ; i < len ; i++ ) {
    if ( ( a[i] < '0' || a[i] > '9' ) &&
         ( a[i] < 'a' || a[i] > 'z' ) ) {
        break;
    }
}


// 有时候,函数参数多的时候,最好也换行
CreateProcess(
              NULL,
              cmdbuf,
              NULL,
              NULL,
              bInhH,
              dwCrtFlags,
              envbuf,
              NULL,
              &siStartInfo,
              &prInfo
             );

// 必要时换行
if ( ch >= '0' || ch <= '9' ||
     ch >= 'a' || ch <= 'z' ||
     ch >= 'A' || ch <= 'Z' )
     
// 空行。不要不加空行,空行可以区分不同的程序块,程序块间,最好加上空行

// 使用 Tab 对齐声明和变量
typedef struct _pt_man_t_ {
    int     numProc;    /* Number of processes                 */
    int     maxProc;    /* Max Number of processes             */
    int     numEvnt;    /* Number of events                    */
    int     maxEvnt;    /* Max Number of events                */
    HANDLE* pHndEvnt;   /* Array of events                     */
    DWORD   timeout;    /* Time out interval                   */
    HANDLE  hPipe;      /* Namedpipe                           */
    TCHAR   usr[MAXUSR];/* User name of the process            */
    int     numMsg;     /* Number of Message                   */
    int     Msg[MAXMSG];/* Space for intro process communicate */
} PT_MAN_T;

函数的in参数

FuncName(char* str)
{
    int len = strlen(str);
    .....
}

char*
GetUserName(struct user* pUser)
{
    return pUser->name;
}
  • 应该先判断一下传进来的那个指针是不是为空。如果传进来的指针为空的话,那么,你的一个大的系统就会因为这一个小的函数而崩溃。一种更好的技术是使用断言(assert)

  • 写有参数的函数时,首要工作,就是要对传进来的所有参数进行合法性检查。而对于传出的参数也应该进行检查,这个动作当然应该在函数的外部,也就是说,调用完一个函数后,应该对其传出的值进行检查。当然,检查会浪费一点时间,但为了整个系统不至于出现 非法操作 或是 Core Dump 的系统级的错误,多花这点时间还是很值得的

对系统调用的返回进行判断

fp = fopen("log.txt", "a");
if ( fp == NULL ){
     printf("Error: open file error/n");
     return FALSE;
 }

if 语句对出错的处理

if ( ch >= '0' && ch <= '9' ){
    /* 正常处理代码 */
}else{
    /* 输出错误信息 */
    printf("error ....../n");
    return ( FALSE );
}

这种结构很不好,特别是如果 “正常处理代码” 很长时,对于这种情况,最好不要用else。先判断错误,如:

if ( ch < '0' || ch > '9' ){
    /* 输出错误信息 */
    printf("error ....../n");
    return ( FALSE );
}
/* 正常处理代码 */