Linux下的C编程特点
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;都会执行。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。