本文來自網站 ieng9.ucsd.edu (http://ieng9.ucsd.edu/~cs30x/rt_lt.rule.html) 加以重新排版.
呃… 它搬家了, 新網址如後: cseweb.ucsd.edu (http://cseweb.ucsd.edu/~ricko/rt_lt.rule.html)
本文開始: (修訂二版)
The "right-left" rule is a completely regular rule for deciphering C declarations. It can also be useful in creating them.
MagicJackTing 發表在 痞客邦 留言(6) 人氣()
在系統在整合或移值時最常用的就是以巨集來置換一些底層 function. 這類的技巧叫 wrapper (意思是包裝紙)
但是在面對像 printf() 或者 scanf() 之類參數個數可變 (或稱不具名參數) 的函數, 就出現只能更換函數名稱, 而無法增減參數個數的冏境, 例如:
// 下例 OK, 但是無法處理參數的異動
#define printf my_printf
// 下例 OK, 但是只能處理剛好二個參數的異動 (增加, 交換)
#define printf(a, b) my_printf(x, b, a)
// 下例 ERR, C 編譯器的 preprocessor 不認識 ...
#define printf(a, b, ...) my_printf(x, a, b, ...)
MagicJackTing 發表在 痞客邦 留言(0) 人氣()
不具名的變動參數以 ... 代表之, 並且至少需要一個具名參數. 因此 ... 的前面至少要有一個參數, 超過一個的部份為此函數的固定參數. 下例為不具名變動參數的樣板.
#include <stdarg.h>
int my_function(int cnt, char* fmt, ...)
{
int ret_value;
va_list ap; // 宣告 變數 ap 型態為 va_list
va_start(ap, fmt); // ap 指向第一個變動參數
...
x = va_arg(ap, int); // 取得一個整數變數
...
*va_arg(ap, long *) = y; // 把一個長整數指標變數塞回去
...
va_end(ap); // 釋放 變數 ap
...
return ret_value;
}
int main(void)
{
...
my_function(12, "abc", 6, 7, 8);
...
}
說明:
MagicJackTing 發表在 痞客邦 留言(0) 人氣()
Keil C51 特定功能
1. 如何產生 'RLC A' 指令: (Keil C51 適用)
那 RRC A 呢? 還沒找到, 只能先用 {asm}
2. 如何把 C51 程式移值到別的 CPU 架構?
在 header file 中定義類似以下的 define, 同時程式中只能用這些定義 (也就是把程式中的 data, xdata... 先都改成 _DATA_, _XDATA_, ...). 因為別的 CPU 沒有這些 '記憶體空間修飾字'.
MagicJackTing 發表在 痞客邦 留言(3) 人氣()