1、關於一年天數的巨集定義(閏年366天):
#define isleapyear(yr) (!((yr) % 400) || (((yr) % 100) && !((yr) % 4)))
#define yearlength(yr) (isleapyear(yr) ? 366 : 365)
2、將秒換算成時間函式:
typedef struct
utctimestruct;
uint8_t monthlength( uint8_t lpyr, uint8_t mon )
else
if ( mon & 1 )
}return ( days );
}void converttoutctime( utctimestruct *tm, utctime sectime )
// fill in the calendar - day, month, year
tm->month = 0;
while ( numdays >= monthlength( isleapyear( tm->year ), tm->month ))
tm->day = numdays;
}}
3、dowhile(0) 用法
看nordic原始碼的時候,看到了巨集定義中全是用dowhile(0) 來實現的,開始有點不理解,於是馬上查了一下,才發現這麼好的技巧,居然自己這麼多年不知道,也不會用,馬上記錄一下:
首先是巨集定義的時候將多餘一條語句的定義放到dowhile(0) 的{}中,這樣在遇到if()巨集 else的時候,就不會出現錯誤。
其次,避免程式中**重複,避免使用goto語句的解決方法,例如,函式開頭申請了一塊記憶體,後邊執行過程檢測到錯誤就釋放記憶體,可以將除了申請和釋放的**放到{}中,遇到錯誤break即可;
最後,空巨集定義可以直接使用dowhile(0) ,避免編譯器警告。
4、賦最大值
int end = (unsigned int)-1;
c語言技巧
c語言技巧 2012 12 22 16 43 49 分類 c c c語言常常讓人覺得它所能表達的東西非常有限,它不具有類似第一級函式和模式匹配這樣的高階功能。但是c非常簡單,並且仍然有一些非常有用的語法技巧和功能。一 指定的初始化 很多人都知道像這樣來靜態地初始化陣列 int fibs c99標準實...
C語言程式設計技巧
指定的初始化 intfibs c99標準實際上支援一種更為直觀簡單的方式來初始化各種不同的集合類資料 如 結構體,聯合體和陣列 陣列 我們可以指定陣列的元素來進行初始化。這非常有用,特別是當我們需要根據一組 define來保持某種對映關係的同步更新時。來看看一組錯誤碼的定義,如 entries ma...
c語言程式設計技巧
c語言常常讓人覺得它所能表達的東西非常有限。它不具有類似第一級函式和模式匹配這樣的高階功能。但是c非常簡單,並且仍然有一些非常有用的語法技巧和功能,只是沒有多少人知道罷了。指定的初始化 很多人都知道像這樣來靜態地初始化陣列 c int fibs c99標準實際上支援一種更為直觀簡單的方式來初始化各種...