1. 程式人生 > >C語言註釋風格(函式、功能、輸入、輸出、返回)

C語言註釋風格(函式、功能、輸入、輸出、返回)

C語言程式設計規範-註釋

規則:
1:一般情況下,源程式有效註釋量必須在20%以上。
    說明:註釋的原則是有助於對程式的閱讀理解,在該加的地方都加了,註釋不宜太多也不能太少,註釋語言必須準確、易懂、簡潔。
2:說明性檔案(如標頭檔案.h檔案、.inc檔案、.def檔案、編譯說明檔案.cfg等)頭部應進行註釋,註釋必須列出:版權說明、版本號、生成日期、作者、內容、功能、與其它檔案的關係、修改日誌等,標頭檔案的註釋中還應有函式功能簡要說明。
示例:下面這段標頭檔案的頭註釋比較標準,當然,並不侷限於此格式,但上述資訊建議要包含在內。
/*************************************************
Copyright (C), 1988-1999, Tech. Co., Ltd.
File name: // 檔名
Author:
Version:
Date: // 作者、版本及完成日期
Description: // 用於詳細說明此程式檔案完成的主要功能,與其他模組
// 或函式的介面,輸出值、取值範圍、含義及引數間的控
// 制、順序、獨立或依賴等關係
Others: // 其它內容的說明
Function List: // 主要函式列表,每條記錄應包括函式名及功能簡要說明
1. ....
History: // 修改歷史記錄列表,每條修改記錄應包括修改日期、修改
// 者及修改內容簡述
1. Date:
Author:
Modification:
2. ...
*************************************************/
3:原始檔頭部應進行註釋,列出:版權說明、版本號、生成日期、作者、模組目的/功能、主要函式及其功能、修改日誌等。
示例:下面這段原始檔的頭註釋比較標準,當然,並不侷限於此格式,但上述資訊建議要包含在內。
/************************************************************
Copyright (C), 1988-1999, Tech. Co., Ltd.
FileName: test.cpp
Author:
Version :
Date:
Description: // 模組描述
Version: // 版本資訊
Function List: // 主要函式及其功能
1. -------
History: // 歷史修改記錄
<author> <time> <version > <desc>
David 96/10/12 1.0 build this moudle
***********************************************************/
說明:Description一項描述本檔案的內容、功能、內部各部分之間的關係及本檔案與其它檔案關係等。History是修改歷史記錄列表,每條修改記錄應包括修改日期、修改者及修改內容簡述。
4:函式頭部應進行註釋,列出:函式的目的/功能、輸入引數、輸出引數、返回值、呼叫關係(函式、表)等。
示例:下面這段函式的註釋比較標準,當然,並不侷限於此格式,但上述資訊建議要包含在內。
/*************************************************
Function: // 函式名稱
Description: // 函式功能、效能等的描述
Calls: // 被本函式呼叫的函式清單
Called By: // 呼叫本函式的函式清單
Table Accessed: // 被訪問的表(此項僅對於牽扯到資料庫操作的程式)
Table Updated: // 被修改的表(此項僅對於牽扯到資料庫操作的程式)
Input: // 輸入引數說明,包括每個引數的作
// 用、取值說明及引數間關係。
Output: // 對輸出引數的說明。
Return: // 函式返回值的說明
Others: // 其它說明
*************************************************/

5:邊寫程式碼邊註釋,修改程式碼同時修改相應的註釋,以保證註釋與程式碼的一致性。不再有用的註釋要刪除。
6:註釋的內容要清楚、明瞭,含義準確,防止註釋二義性。
說明:錯誤的註釋不但無益反而有害。
7:避免在註釋中使用縮寫,特別是非常用縮寫。
說明:在使用縮寫時或之前,應對縮寫進行必要的說明。
8:註釋應與其描述的程式碼相近,對程式碼的註釋應放在其上方或右方(對單條語句的註釋)相鄰位置,不可放在下面,如放於上方則需與其上面的程式碼用空行隔開。
示例:如下例子不符合規範。
例1:
/* get replicate sub system index and net indicator */

repssn_ind = ssn_data[index].repssn_index;
repssn_ni = ssn_data[index].ni;
例2:
repssn_ind = ssn_data[index].repssn_index;
repssn_ni = ssn_data[index].ni;
/* get replicate sub system index and net indicator */
應如下書寫
/* get replicate sub system index and net indicator */
repssn_ind = ssn_data[index].repssn_index;
repssn_ni = ssn_data[index].ni;
9:對於所有有物理含義的變數、常量,如果其命名不是充分自注釋的,在宣告時都必須加以註釋,說明其物理含義。變數、常量、巨集的註釋應放在其上方相鄰位置或右方。
示例:
/* active statistic task number */
#define MAX_ACT_TASK_NUMBER 1000
#define MAX_ACT_TASK_NUMBER 1000 /* active statistic task number */
10:資料結構宣告(包括陣列、結構、類、列舉等),如果其命名不是充分自注釋的,必須加以註釋。對資料結構的註釋應放在其上方相鄰位置,不可放在下面;對結構中的每個域的註釋放在此域的右方。
示例:可按如下形式說明列舉/資料/聯合結構。
/* sccp interface with sccp user primitive message name */
enum SCCP_USER_PRIMITIVE
{
N_UNITDATA_IND, /* sccp notify sccp user unit data come */
N_NOTICE_IND, /* sccp notify user the No.7 network can not */
/* transmission this message */
N_UNITDATA_REQ, /* sccp user's unit data transmission request*/
};
11:全域性變數要有較詳細的註釋,包括對其功能、取值範圍、哪些函式或過程存取它以及存取時注意事項等的說明。
示例:
/* The ErrorCode when SCCP translate */
/* Global Title failure, as follows */ // 變數作用、含義
/* 0 - SUCCESS 1 - GT Table error */
/* 2 - GT error Others - no use */ // 變數取值範圍
/* only function SCCPTranslate() in */
/* this modual can modify it, and other */
/* module can visit it through call */
/* the function GetGTTransErrorCode() */ // 使用方法
BYTE g_GTTranErrorCode;
12:註釋與所描述內容進行同樣的縮排。
說明:可使程式排版整齊,並方便註釋的閱讀與理解。
示例:如下例子,排版不整齊,閱讀稍感不方便。
void example_fun( void )
{
/* code one comments */
CodeBlock One
/* code two comments */
CodeBlock Two
}
應改為如下佈局。
void example_fun( void )
{
/* code one comments */
CodeBlock One
/* code two comments */
CodeBlock Two
}
13:將註釋與其上面的程式碼用空行隔開。
示例:如下例子,顯得程式碼過於緊湊。
/* code one comments */
program code one
/* code two comments */
program code two

應如下書寫
/* code one comments */
program code one
/* code two comments */
program code two
14:對變數的定義和分支語句(條件分支、迴圈語句等)必須編寫註釋。
說明:這些語句往往是程式實現某一特定功能的關鍵,對於維護人員來說,良好的註釋幫助更好的理解程式,有時甚至優於看設計文件。
15:對於switch語句下的case語句,如果因為特殊情況需要處理完一個case後進入下一個case處理,必須在該case語句處理完、下一個case 語句前加上明確的註釋。
說明:這樣比較清楚程式編寫者的意圖,有效防止無故遺漏break語句。
示例(注意斜體加粗部分):
case CMD_UP:
    ProcessUp();
    break;
case CMD_DOWN:
    ProcessDown();
    break;

case CMD_FWD:

     ProcessFwd();

    if (...)
    {
        ...
        break;
    }
    else
    {
        ProcessCFW_B(); // now jump into case CMD_A
    }
case CMD_A:
    ProcessA();
    break;
case CMD_B:
    ProcessB();
    break;
case CMD_C:
     ProcessC();
    break;
case CMD_D:
    ProcessD();
    break;
...
建議:
1:避免在一行程式碼或表示式的中間插入註釋。
說明:除非必要,不應在程式碼或表達中間插入註釋,否則容易使程式碼可理解性變差。
2:通過對函式或過程、變數、結構等正確的命名以及合理地組織程式碼的結構,使程式碼成為自注釋的。
說明:清晰準確的函式、變數等的命名,可增加程式碼可讀性,並減少不必要的註釋。
3:在程式碼的功能、意圖層次上進行註釋,提供有用、額外的資訊。
說明:註釋的目的是解釋程式碼的目的、功能和採用的方法,提供程式碼以外的資訊,幫助讀者理解程式碼,防止沒必要的重複註釋資訊。
示例:如下注釋意義不大。
/* if receive_flag is TRUE */
if (receive_flag)

而如下的註釋則給出了額外有用的資訊。
/* if mtp receive a message from links */
if (receive_flag)
4:在程式塊的結束行右方加註釋標記,以表明某程式塊的結束。
說明:當代碼段較長,特別是多重巢狀時,這樣做可以使程式碼更清晰,更便於閱讀。
示例:參見如下例子。
if (...)
{
    // program code

    while (index < MAX_INDEX)
    {
        // program code
    } /* end of while (index < MAX_INDEX) */ // 指明該條while語句結束
} /* end of if (...)*/ // 指明是哪條if語句結束
5:註釋格式儘量統一,建議使用"/* …… */"。
6:註釋應考慮程式易讀及外觀排版的因素,使用的語言若是中、英兼有的,建議多使用中文,除非能用非常流利準確的英文表達。
說明:註釋語言不統一,影響程式易讀性和外觀排版,出於對維護人員的考慮,建議使用中文。

相關推薦

C語言註釋風格函式功能輸入輸出返回

C語言程式設計規範-註釋規則: 1:一般情況下,源程式有效註釋量必須在20%以上。     說明:註釋的原則是有助於對程式的閱讀理解,在該加的地方都加了,註釋不宜太多也不能太少,註釋語言必須準確、易懂、簡潔。 2:說明性檔案(如標頭檔案.h檔案、.inc檔案、.def檔案、

C語言關鍵字volatile不知道的別說你是幹嵌入式的

       我在網上看見一個帖子說回答不出這個問題的人是不會被僱傭的。這是區分C程式設計師和嵌入式系統程式設計師的最基本的問題。搞嵌入式的傢伙們經常同硬體、中斷、RTOS等打交道,所有這些都要求用到volatile變數。下面來看下面試題中提到的問題(答案我從網路整理,以

c語言】巨集#define#和##函式比較

#define -定義識別符號 ef:#define在預處理階段替代所有的Max #define Max 100 int main() { printf("%d\n", Max); system("pause"); return 0

C語言指標知識點:指標在函式輸入輸出時 的性質

主調函式可以把棧區、堆區、全域性區的資料地址傳給被調函式;被調函式只能返回堆區和全域性區的資料及地址。 指標作為函式的傳入引數,由主調函式分配記憶體;指標作為函式的輸出時,由被調函式分配記憶體。 如果想通過形參改變實參的內容,必須地址傳遞(C中,C++中還可以通過引用的

C語言天天練十八】字元/字串輸入函式fgetcfgetsgetcgetchar和gets

#include <stdio.h> intfgetc(FILE *stream); char *fgets(char *s, int size, FILE *stream); int getc(FILE *stream); int getchar(void);

1079: C語言程式設計教程第三版課後習題8.2---求方程 的根,用三個函式分別求當b^2-4ac大於0等於0和小於0時的根,並輸出結果。從主函式輸入abc的值。【兩種方法】

題目描述 求方程 的根,用三個函式分別求當b^2-4ac大於0、等於0、和小於0時的根,並輸出結果。從主函式輸入a、b、c的值。 輸入 a b c 輸出 x1=? x2=? 樣例輸入 4

C語言】編寫一個函式,將一個數字字串轉換成這個字串對應的數字包括正浮點數負浮點數

//編寫一個函式,將一個數字字串轉換成這個字串對應的數字(包括正浮點數、負浮點數) //例如:“12.34“ 返回12.34. " -12.34" 返回12.34 #include<

C語言學習筆記—— 函式遞迴和指標

一、函式1、一個簡單的函式示例函式是完成特定任務的獨立程式程式碼單元。#include <stdio.h> void printStar();//宣告函式原型,函式原型會指明函式的型別和函式接受的引數。前面的void是函式型別,表明函式沒有返回值 #define

C語言的條件編譯#if, #elif, #else, #endif#ifdef, #ifndef

n+1 ifdef int pan 不能 ica 推薦 代碼 表達式 有些程序在調試、兼容性、平臺移植等情況下可能想要通過簡單地設置一些參數就生成一個不同的軟件,這當然可以通過變量設置,把所有可能用到的代碼都寫進去,在初始化時配置,但在不同的情況下可能只用到一部分代碼,就

C語言入門學習02——HelloWorld程式分析&printf函式的用法

  接著上一篇 C語言入門學習(01)——C程式設計環境的搭建及HelloWorld程式 繼續 //本文不是最終版本,該教程還在編寫整理中。 目錄 Part_2.1:HelloWorld程式的解釋 Part_2.2:printf函式的用法 P

C語言字串處理基礎函式

1.strlen()函式 功能:函式返回字串str 的長度( 即空值結束符之前字元數目,不包括控制結束符)。 語法: #include <string.h> size_t strlen( char *str ); 例子: #include <stdio

02-線性結構2 一元多項式的乘法與加法運算C語言 + 註釋

設計函式分別求兩個一元多項式的乘積與和。 輸入格式: 輸入分2行,每行分別先給出多項式非零項的個數,再以指數遞降方式輸入一個多項式非零項係數和指數(絕對值均為不超過1000的整數)。數字間以空格分隔。 輸出格式: 輸出分2行,分別以指數遞降方式輸出乘積多項式以及和多項

C語言字元篇記憶體函式

memcpy不可以把目的地址寫成本身 但是memmove可以,因為它是先儲存到臨時空間 #include <string.h>   void *memcpy(void *dest, const voi

程式猿之---C語言細節9巨集定義maxa,b巨集定義細節大小端判斷(int&)a什麼意思

主要內容:巨集定義、max(a,b)巨集定義細節、大小端判斷、(int&)a什麼意思 #if 1 #include <stdio.h> // 注意空格 #define F (x) ((x) - 1) // F代表後面 #define F(x)

C語言 不使用strcpy 函式實現字串複製功能

#include<stdio.h> void Copy_string(char* str1, char* str2);   //函式宣告 int main() {     char str1[20];     char str2[20];     puts("請輸入字串str1:");   

C++和C語言的區別——函式的區別

C++有新增的新的特性也有與C語言的一些區別,為了方便學習,就特別對重要的一些特性和區別進行學習。 此次學習的是:1、函式的預設引數,2、inline函式,3、函式過載  1、C++的函式預設引數:在函式宣告或定義時候,給函式引數預先賦值,當函式呼叫有空缺引數時,就將該值作為預設引

c語言實現一個strcat函式功能相同的函式

extern char *strcat(char *dest,char *src); 把src所指字串新增到dest結尾處(覆蓋dest結尾處的'\0')並新增'\0'。 #include "std

C語言學習總結1-遞迴函式的理解

啥是遞迴? 即是該函式呼叫它本身自己,這種呼叫過程稱為遞迴。 遞迴可以相當於迴圈,所以想結束遞迴,就必須有終止遞迴的條件測試部分,否則就會出現無限遞迴(即無限迴圈)。同時,這也是使用遞迴的難點

C語言反轉陣列reverse函式

#include <stdio.h> //巨集定義陣列大小 #define N 6 //主函式 int main(void){ //定義陣列     int arr[N] = {1,53,7,2,9,8};     int i,j=N-1; //列印原陣列  

C語言的字串處理函式

1、strcpy 2、strcat 3、strncat 4、strcmp 5、strlen 6、bzreo: eg:bzero(ptr,sizeof(char) * 100)    :    從ptr