C語言常用的編程規範

来源:https://www.cnblogs.com/fusangshu/archive/2017/12/30/8151437.html
-Advertisement-
Play Games

1排版 1 1相對獨立的程式塊之間、變數說明之後必須加空行。 示例:如下例子不符合規範。 if (!valid_ni(ni)) { ... // program code } repssn_ind = ssn_data[index].repssn_index; repssn_ni = ssn_dat ...


1排版

1-1相對獨立的程式塊之間、變數說明之後必須加空行。
示例:如下例子不符合規範。
if (!valid_ni(ni))
{
... // program code
}
repssn_ind = ssn_data[index].repssn_index;
repssn_ni = ssn_data[index].ni;
應如下書寫
if (!valid_ni(ni))
{
... // program code
}
repssn_ind = ssn_data[index].repssn_index;
repssn_ni = ssn_data[index].ni;
1-2:較長的語句(>80 字元)要分成多行書寫,長表達式要在低優先順序操作符處劃分新行,
操作符放在新行之首,劃分出的新行要進行適當的縮進,使排版整齊,語句可讀。
示例:
perm_count_msg.head.len = NO7_TO_STAT_PERM_COUNT_LEN

  • STAT_SIZE_PER_FRAM * sizeof( _UL );
    act_task_table[frame_id * STAT_TASK_CHECK_NUMBER + index].occupied
    = stat_poi[index].occupied;
    act_task_table[taskno].duration_true_or_false
    = SYS_get_sccp_statistic_state( stat_item );
    report_or_not_flag = ((taskno < MAX_ACT_TASK_NUMBER)
    && (n7stat_stat_item_valid (stat_item))
    && (act_task_table[taskno].result_data != 0));
    1-3:不允許把多個短語句寫在一行中,即一行只寫一條語句。
    示例:如下例子不符合規範。
    rect.length = 0; rect.width = 0;
    應如下書寫
    rect.length = 0;
    rect.width = 0;
    1-4: if、 for、 do、 while、 case、 switch、 default 等語句自占一行,且 if、 for、 do、 while
    等語句的執行語句部分無論多少都要加括弧{}。
    示例:如下例子不符合規範。
    if (pUserCR == NULL) return;
    應如下書寫:
    if (pUserCR == NULL)
    {
    return;
    }
    1-5:對齊只使用空格鍵,不使用 TAB 鍵。
    說明:以免用不同的編輯器閱讀程式時,因 TAB 鍵所設置的空格數目不同而造成程式佈局
    不整齊,不要使用 BC 作為編輯器合版本,因為 BC 會自動將 8 個空格變為一個 TAB 鍵,
    因此使用 BC 合入的版本大多會將縮進變亂。
    1-6:程式塊的分界符(如 C/C++語言的大括弧‘{’和‘}’)應各獨占一行並且位於同一列,
    同時與引用它們的語句左對齊。在函數體的開始、類的定義、結構的定義、枚舉的定義以
    及 if、 for、 do、 while、 switch、 case 語句中的程式都要採用如上的縮進方式。
    示例:如下例子不符合規範。
    for (...) {
    ... // program code
    }
    if (...)
    {
    ... // program code
    }
    void example_fun( void )
    {
    ... // program code
    }
    應如下書寫。
    for (...)
    {
    ... // program code
    }
    if (...)
    {
    ... // program code
    }
    void example_fun( void )
    {
    ... // program code
    }
    1-7:一行程式以小於 80 字元為宜,不要寫得過長。

2 註釋

2-1:一般情況下,源程式有效註釋量必須在 20%以上。
說明:註釋的原則是有助於對程式的閱讀理解,在該加的地方都加了,註釋不宜太多也不能
太少,註釋語言必須準確、易懂、簡潔。
2-2:邊寫代碼邊註釋,修改代碼同時修改相應的註釋,以保證註釋與代碼的一致性。不再
有用的註釋要刪除。
2-3:註釋應與其描述的代碼相近,對代碼的註釋應放在其上方或右方(對單條語句的註釋)
相鄰位置,不可放在下麵,如放於上方則需與其上面的代碼用空行隔開。
示例:如下例子不符合規範。
例 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;
2-4:對於所有有物理含義的變數、常量,如果其命名不是充分自註釋的,在聲明時都必須
加以註釋,說明其物理含義。變數、常量、巨集的註釋應放在其上方相鄰位置或右方。
示例:
/
active statistic task number */

define MAX_ACT_TASK_NUMBER 1000

define MAX_ACT_TASK_NUMBER 1000 /* active statistic task number /
2-5:註釋與所描述內容進行同樣的縮排。
說明:可使程式排版整齊,並方便註釋的閱讀與理解。
示例:如下例子,排版不整齊,閱讀稍感不方便。
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
}
2-6:在程式塊的結束行右方加註釋標記,以表明某程式塊的結束。
說明:當代碼段較長,特別是多重嵌套時,這樣做可以使代碼更清晰,更便於閱讀。
示例:參見如下例子。
if (...)
{
// program code
while (index < MAX_INDEX)
{
// program code
} /
end of while (index < MAX_INDEX) / // 指明該條 while 語句結束
} /
end of if (...)/ // 指明是哪條 if 語句結束
2-7:註釋格式儘量統一,建議使用“/
…… */”。
2-8:註釋應考慮程式易讀及外觀排版的因素,使用的語言若是中、英兼有的,建議多使用
中文,除非能用非常流利準確的英文表達。
說明:註釋語言不統一,影響程式易讀性和外觀排版,出於對維護人員的考慮,建議使用中
文。

3 標識符命名

3-1:標識符的命名要清晰、明瞭,有明確含義,同時使用完整的單詞或大家基本可以理解
的縮寫,避免使人產生誤解。
說明:較短的單詞可通過去掉“母音”形成縮寫;較長的單詞可取單詞的頭幾個字母形成縮
寫;一些單詞有大家公認的縮寫。
示例:如下單詞的縮寫能夠被大家基本認可。
temp 可縮寫為 tmp ;
flag 可縮寫為 flg ;
statistic 可縮寫為 stat ;
increment 可縮寫為 inc ;
message 可縮寫為 msg ;
3-2:命名中若使用特殊約定或縮寫,則要有註釋說明。
說明:應該在源文件的開始之處,對文件中所使用的縮寫或約定,特別是特殊的縮寫,進行
必要的註釋說明。
3-3:自己特有的命名風格,要自始至終保持一致,不可來回變化。
說明:個人的命名風格,在符合所在項目組或產品組的命名規則的前提下,才可使用。(即
命名規則中沒有規定到的地方纔可有個人命名風格)。
3-4:對於變數命名,禁止取單個字元(如 i、 j、 k...),建議除了要有具體含義外,還能表
明其變數類型、數據類型等,但 i、 j、 k 作局部迴圈變數是允許的。
說明:變數,尤其是局部變數,如果用單個字元表示,很容易敲錯(如 i 寫成 j),而編譯時
又檢查不出來,有可能為了這個小小的錯誤而花費大量的查錯時間。
示例:下麵所示的局部變數名的定義方法可以借鑒。
int liv_Width
其變數名解釋如下:
l 局部變數(Local) (其它: g 全局變數(Global) ...)
i 數據類型(Interger)
v 變數(Variable) (其它: c 常量(Const) ...)
Width 變數含義
這樣可以防止局部變數與全局變數重名。
3-5:命名規範必須與所使用的系統風格保持一致,併在同一項目中統一,比如採用 UNIX
的全小寫加下劃線的風格或大小寫混排的方式,不要使用大小寫與下劃線混排的方式,用
作特殊標識如標識成員變數或全局變數的 m_和 g_,其後加上大小寫混排的方式是允許的。
示例: Add_User 不允許, add_user、 AddUser、 m_AddUser 允許。
3-6:在同一軟體產品內,應規劃好介面部分標識符(變數、結構、函數及常量)的命名,
防止編譯、鏈接時產生衝突。
說明:對介面部分的標識符應該有更嚴格限制,防止衝突。如可規定介面部分的變數與常量
之前加上“模塊”標識等。
3-7:用正確的反義片語命名具有互斥意義的變數或相反動作的函數等。
說明:下麵是一些在軟體中常用的反義片語。
add / remove begin / end create / destroy
insert / delete first / last get / release
increment / decrement put / get
add / delete lock / unlock open / close
min / max old / new start / stop
next / previous source / target show / hide
send / receive source / destination
cut / paste up / down
示例:
int min_sum;
int max_sum;
int add_user( BYTE user_name );
int delete_user( BYTE
user_name );

4 可讀性

4-1:註意運算符的優先順序,並用括弧明確表達式的操作順序,避免使用預設優先順序。
4-2:函數的規模儘量限制在 200 行以內。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • (個人知識有限,難免有誤,請見諒) 標準文檔流,顧名思義,是要按照一定規矩排列的,預設的就是元素會從左至右,從上至下排列,塊級會獨占一行,行內元素會和小伙伴們共用一行。 本來在標準文檔流下,各個元素相安無事,可突然有一天某個元素心想啊,我那麼優秀,不該出現在這裡啊,於是它成精了,它發現了一道大門走向 ...
  • 1. 先把一個div設置成A4紙的大小,寬21cm,高29.7cm ```html ``` , ``` #abody { width: 21cm; height: 29.7cm; margin: 0 auto; overf... ...
  • 1.Properties類簡介 Properties類(Java.util.Properties),主要用於讀取Java的配置文件,各種語言都有自己所支持的配置文件,配置文件中很多變數是經常改變的,這樣做也是為了方便用戶,讓用戶能夠脫離程式本身去修改相關的變數設置。像Python支持的配置文件是.i ...
  • 簡單工廠又稱為靜態工廠方法(static factory method)模式,簡單工廠是由一個工廠來決定創建出哪一種個體的實現,在很多的討論中,簡單工廠做為工廠方法模式(Factory Method)的一個特殊案例出現. 這個模式封裝的變化點是什麼? 這是每一個模式都應該考慮的核心問題,一定要記得, ...
  • 偶然看見這樣一個案例,先上代碼: public class GenericAdd{ //泛型方法實現兩個數相加 public <T extends Number> double add(T t1, T t2){ double sum = 0.0; sum = t1.doubleValue() + t ...
  • MarkDown筆記 目的 寫這篇文章,一來是記錄一下,以備日後使用;二來是我看到網上很多關於MarkDown的語法總結得不是很全面。 語法 1.標題 標題有兩種表示方式,第一種是Atx,這是我見的最多的;第二種是Setext。下麵分別來介紹一下。 (1)Atx 使用 表示,和HTML的h1~h6標 ...
  • 讓我們先來預覽一下代碼運行效果吧: 首先分析163郵箱登陸頁面的網頁結構(按F12或單擊滑鼠右鍵選擇審查元素) 1、定位到登陸框(註意登錄框是一個iframe,如果不定位到iframe的話是無法找到之後的郵箱地址框和密碼輸入框的) 2、定位到郵箱地址框(name='email') 3、定位到密碼輸入 ...
  • C 語言的 static 關鍵字有三種(具體來說是兩種)用途: 1. 靜態局部變數:用於函數體內部修飾變數,這種變數的生存期長於該函數。 要明白這個用法,我們首先要瞭解c/c++的記憶體分佈,以及static所在的區間。 對於一個完整的程式,在記憶體中的分佈情況如下圖: 1.棧區: 由編譯器自動分配釋放 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...