基本事項

原始碼存放庫

文件

參與

子專案

相關專案

其他

Apache 開發人員的 C 語言風格指南

由 Paul Sutton 編輯 paul@awe.com。根據 1996 年 11 月的投票
1997 年 7 月經投票進一步改良。

簡介

[這部分應說明程式碼應排版成易於其他熟悉 Apache 的人閱讀。函數應簡短且易於理解。應提供註解來說明不顯而易見的程式碼原理,並文件化函數的行為。只要能讓版面更清晰,則可以打破這些準則]

此樣式可以使用以下參數透過 GNU indent 產生

-i4 -npsl -di0 -br -nce -d0 -cli0 -npcs -nfc1 -nut

準則

詳細資訊與範例

縮排、一般風格

每層縮排為四個空白。絕不可使用 tab 字元。針對函數宣告與控制流程關鍵字,下述提供個別的縮排規則。

範例

main(int argc, char **argc)
{
if (argc != 0)  {
    fprintf(stderr, "No arguments allowed\n");
    exit(1);
}
exit(0);
}

如果表達式(或常式宣告或呼叫)超出第 80 欄,則條款或參數會在適當位置進行換行,換行部分會縮排至表達式第一條款(或函數第一個參數)的下方。有條件的表達式應該換行,以在可能的情況下維持單一或括號中條款的原子性,並將布林運算子放在行首(優先)或行尾。

範例

 static const char *really_long_name(int i, int j,
                                     const char *args, void *foo,
                                     int k)

 if (cond1 && (item2 || item3) && (!item4)
     && (item5 || item6) && item7)  {
     do_a_thing();
 }

註解

針對無法從程式碼本身明確得知功能的程式碼,提供相關註解加以說明。必要時,針對特定程式碼區塊提供依據。

註解的縮排應與周圍文字相同。

範例

code;
/* comment */
code;

函數宣告與格式

函數格式如下:

範例

int main(int argc, char **argv)
{
    code;
}

回傳類型與函數置於同一直行。參數(如果有的話)以 ANSI 風格表示。如果沒有參數,則宣告函數為 void。函數名稱與開括弧之間不加空白,每個參數間的分隔逗點後使用一個空白。開括弧置於定義後的一行,縮排以與回傳類型文字開頭對齊。程式碼使用四個空白縮排,閉括弧縮排以與開括弧對齊。另請參閱關於縮排 長宣告與呼叫 的區段。

函數呼叫

函數呼叫中的逗號後方使用空白。函數名稱與開括弧之間不加空白。

範例

f(a, b);

另請參閱關於縮排 長宣告與呼叫 的區段。

流程控制格式

流程控制敘述(ifwhilefor 等)格式如下:

範例

if (expr)  {
    code;
}
else  {
    code;
}

關鍵字和開啟括弧間隔一空格。開啟大括弧放在流程關鍵字同一行。程式碼本身以四個空格縮排。關閉大括弧縮排與開啟大括弧對齊。如果使用 else 子句,則 else 關鍵字放在關閉大括弧後的下一行,並縮排與對應的 if 對齊。另請參閱縮排長表達式的部分。

for 佈局

分號後加空格。

範例

for (a; b; c)

switch 佈局

switch() 內部的 case 行縮排與 switch 陳述式同層級。每個 case 的程式碼縮排四個空格。大括弧的佈局與其他控制流關鍵字相同。

範例

switch (x)  {
case a:
    code;
case b:
    code;
}

表達式

賦值和運算元前後加空格。一元運算元(增量、減量和否定)與 lvalue 之間不加空格。

範例

a = b
a + b
a < b
a = -b
a = !b
++a

列舉大寫

無規則。