標籤:c linux gnu
Linux下代碼括弧“{”和“}”的使用原則如下
(1)對於結構體、if/for/while/switch語句,“{”不另起一行,例如:
struct var_data{int len;char data[0];};if (a == b){a = c;d = a;}for (i = 0; i < 10; i++){a = c;d = a;}
(2)如果if、for迴圈只有1行,不要加“{”和“}”。
(3)if和else混用的情況下,else語句不另起一行,例如:
if (a == y){...}else{...}
(4)對於函數,”{“另起一行,在switch和case語句方面,Linux建議switch和case對齊,例如:
switch{case 'G':case 'g':mem <<= 30;break;case 'M':case 'm':mem <<= 20;break;case 'K':case 'k':mem <<= 10;break;default:break;}
GNU C的擴充
1 零長度和變數長度數組
truct var_data {int len;char data[0];}
也可以用一個變數定義數組,例如:
int main (int argc, char *argv[]){int i, n = argc;double x[n];for (i = 0; i < n; i++)x[i] = i;return 0;}
2 case 範圍支援,例如:
switch (ch) {case '0'... '9': c -= '0';break;case 'a'... 'f': c -= 'a' - 10;break;case 'A'... 'F': c -= 'A' - 10;break;}
3 語句運算式
GNU C把括弧中的複合陳述式看做是一個運算式,稱為語句運算式。
#define min_t(type, x, y) ({type __x = (x); type __y = (y); __x < __y ? __x: __y})
4 typeof 關鍵字
typeof(x)可以獲得x的類型,因此上面的定義可以變成:
#define min(x, y) ({ const typeof(x) _x = (x);const typeof(y) _y = (y);_x < _y ? x: y;})
5 可變參數宏
#define pr_debug(fmt, arg...) printf(fmt, ##arg)
6 在宏定義中使用do{}while(0)
#define SAFE_FREE(p) do{free(p); p = NULL;}while(0)if (NULL != p)SAFE_FREE(p);else...
1)上面的代碼如果不用do{}while(0)包含起來,展開過後if後面就會出現兩天語句,導致else分支沒有對應的if,編譯失敗。
2)假設沒有後面的else分支,則不論if的條件是否成立,p = NULL;都會執行。
Linux下的C編程特點