程式設計風格(轉貼)

2021-04-01 10:21:15 字數 3137 閱讀 5269

寫作乾淨美觀的**,不僅僅使得**更容易閱讀,還使得**能夠成為一件藝術品。同微軟的匈牙利命名法一樣,在linux上程式設計主要有兩種程式設計風格: gnu風格和linux核心風格

程式設計風格

linux作為gnu家族的一員,上面的源**數以萬計,而在閱讀這些源**時我們會發現,不同的源**的美觀程度和程式設計風格都不盡一樣,有些**,如glibc的**:

static void release_libc_mem (void) 
或者是linux核心的**:
static int do_linuxrc(void * shell) ; close(0);close(1);close(2); setsid(); (void) open("/dev/console",o_rdwr,0); (void) dup(0); (void) dup(0); return execve(shell, argv, envp_init); }
都令人看起來賞心悅目,而其它有些程式設計師寫的程式則讓人看起來直皺眉頭,寫作乾淨美觀的**,不僅僅使得**更容易閱讀,還使得**能夠成為一件藝術品。同微軟的匈牙利命名法一樣,在linux上程式設計主要有兩種程式設計風格: gnu風格和linux核心風格,下面將分別介紹。

下面幾條是基於gnu開放源**方面的要求:

在任何情況下都不要引用有版權的源**。

善意接受別人給您的程式新增的**,但請記住檢查其合法性,即是否也是 gnu 的。

編寫日誌檔案(changelog),這將使您的**更容易維護。

下面是gnu對c程式的風格要求:

函式的開頭的左花括號放到最左邊,避免把任何其它的左花括號、左括號或者左方括號放到最左邊。對於函式定義來說,把函式名的起始字元放到最左邊也同樣重要。這幫助任何尋找函式定義,並且可能有助於幫助某些工具識別它們。因此,正確的格式應該是:

static char * concat (s1, s2) /* name starts in column zero here */ char *s1, *s2; 
或者,如果希望使用標準c,定義的格式是:
static char * concat (char *s1, char *s2) 
如果引數不能夠被美觀地放在一行中,按照下面的方式把它們分開:
int lots_of_args (int an_integer, long a_long, short a_short, double a_double, float a_float) ...if (x < foo (y, z)) haha = bar[4] + 5; else  return ++x + bar (); }
在左括號之前以及逗號之後新增空格將使程式更加容易閱讀。尤其是在逗號之後新增空格。當我們把乙個表示式分成多行的時候,在操作符之前而不是之後分割。
if (foo_this_is_long && bar > win (x, y, z) && remaining_condition)
盡力避免讓兩個不同優先順序的操作符出現在相同的對齊方式中。例如,不要象下面那樣寫:
mode = (inmode[j] == voidmode || get_mode_size (outmode[j]) > get_mode_size (inmode[j]) ? outmode[j] : inmode[j]);
應該附加額外的括號以使得文字縮排可以表示出這種巢狀:
mode = ((inmode[j] == voidmode || (get_mode_size (outmode[j]) > get_mode_size (inmode[j]))) ? outmode[j] : inmode[j]);
按照如下方式排版do-while語句:
do  while (a > 0);
每個程式都應該以一段簡短地、說明其功能的注釋開頭。 例如:`fmt - filter for ****** filling of text'。

請為每個函式書寫注釋以說明函式做了些什麼,需要哪些種類的引數,引數可能值的含義以及用途。如果按照常見的方式使用c語言型別,就沒有必要逐字重寫c引數宣告的含義。如果它使用了任何非標準的東西,或者是可能導致函式不能工作的任何可能的值(例如,不能保證正確處理乙個包含了新行的字串),請確認對它們進行了說明。如果存在重要的返回值,也需要對其進行解釋。

不要在跨越了行的宣告中宣告多個變數。在每一行中都以乙個新的宣告開頭。例如,不應該:

int foo, bar;
而應該:
int foo, bar;
或者:
int foo; int bar;
如果它們是全域性變數,在它們之中的每乙個之前都應該新增一條注釋。

當在乙個if語句中巢狀了另乙個if-else語句,總是用花括號把if-else括起來。因此,不要寫:

if (foo) if (bar) win (); else lose ();
而總是要寫:
if (foo) 
如果在else語句中巢狀了乙個if語句,即可以像下面那樣寫else if:
if (foo) ... else if (bar) ...
按照與then那部分**相同的縮排方式縮排else if的then部分**,也可以在花括號中像下面那樣把if巢狀起來:
if (foo) ... else 
要在同乙個宣告中同時說明結構標識和變數或者結構標試和型別定義(typedef)。 單獨地說明結構標試,而後用它定義變數或者定義型別。

盡力避免在if的條件中進行賦值。例如,不要寫:

if ((foo = (char *) malloc (sizeof *foo)) == 0) fatal ("virtual memory exhausted");
而要寫:
foo = (char *) malloc (sizeof *foo); if (foo == 0) fatal ("virtual memory exhausted");
請在名字中使用下劃線以分隔單詞,堅持使用小寫; 把大寫字母留給巨集和列舉常量,以及根據統一的慣例使用的字首。 例如,應該使用類似ignore_space_change_flag的名字;不要使用類似icantreadthis的名字。

用於標明乙個命令列選項是否被給出的變數應該在選項含義的說明之後,而不是選項字元 之後,被命名。一條注釋即應該說明選項的精確含義,還應該說明選項的字母。例如,

/* ignore changes in horizontal whitespace (-b). */ int ignore_space_change_flag;

物件導向程式設計風格 基於物件程式設計風格

本文主要通過實現thread 類來展現兩種程式設計風格的不同點。很多人沒有區分 物件導向 和 基於物件 兩個不同的概念。物件導向的三大特點 封裝,繼承,多型 缺一不可。通常 基於物件 是使用物件,但是無法利用現有的物件模板產生新的物件型別,繼而產生新的物件,也就是說 基於物件 沒有繼承的特點。而 多...

各種程式設計風格

在過去的n年中,我遇到了很多使用囧然不同風格的開發者,下面是我所知道的一些,你還知道其它的嗎?散彈槍程式設計 這種程式設計風格是一種開發者使用非常隨意的方式對待 嗯,這個方法呼叫出錯了 那麼我會試著把傳出的引數從false變成true 當然依然出錯,於是我們的程式設計師會這樣 好吧,那我就注釋掉整個...

c c 程式設計風格

1.程式設計風格 請寫出 bool flag 與 零值 比較的 if 語句。3分 標準答案 if flag if flag 如下寫法均屬不良風格,不得分。if flag true if flag 1 if flag false if flag 0 請寫出 float x 與 零值 比較的 if 語句...