作者 主題: 這樣的define是何意思#defineL_SUB(r, a)M_SUB((r)->l_ui, (r)->l_uf, (a)->l_ui, (a)->l_u  (閱讀 4696 次)

0 會員 與 1 訪客 正在閱讀本文。

kidmany2001

  • 懷疑的國中生
  • **
  • 文章數: 68
    • 檢視個人資料
這樣的define是何意思 help....好像是相減
可是怎麼看懂呢? 像是火星文

#define   L_SUB(r, a)   M_SUB((r)->l_ui, (r)->l_uf, (a)->l_ui, (a)->l_uf)

#define M_SUB(r_i, r_f, a_i, a_f)   /* r -= a */




elleryq

  • 區域板主
  • 鑽研的研究生
  • *****
  • 文章數: 908
  • 性別: 男
    • 檢視個人資料
    • Thinking more...

可以先在你程式裡面放
L_SUB( x, y );
M_SUB( x, y );

然後用 gcc -E 編譯 ( visual c++ 的話,也可使用 cl /E 或 cl /P  )
看編譯器怎麼解釋 #define
Plan your work, then work your plan.
我的首頁:http://blog.elleryq.idv.tw
351899by http://counter.li.org

JonesLai

  • 可愛的小學生
  • *
  • 文章數: 11
    • 檢視個人資料
難怪看不懂,M_SUB()巨集函式被截斷了,是從下面這一個source來的嗎?

用途就是 r -= a阿(有註解耶),可是你code好像有改過!?

你說的#define   L_SUB(r, a)   M_SUB((r)->l_ui, (r)->l_uf, (a)->l_ui, (a)->l_uf) 就巨集函式定義為另外一個巨集函式,裡面的輸入參數是要參考結構吧。
你由最下面往上看就會比較好理解,一個一個的替換掉就應該可以看得懂了,有問題去翻C語言的巨集函式方面的資料。

Primitive operations on long fixed point values.  If these are reminiscent of assembler op codes it's only because some may be replaced by inline assembler for particular machines someday. These are the (kind of inefficient) run-anywhere versions.
代碼: [選擇]
// Module burst.c

// fixed point ntp timestamp aritmetics
#define u_int32 unsigned long
#define int32 long
typedef struct {
union {
u_int32 Xl_ui;
int32 Xl_i;
} Ul_i;
union {
u_int32 Xl_uf;
int32 Xl_f;
} Ul_f;
} l_fp;

#define l_ui Ul_i.Xl_ui /* unsigned integral part */

//... skip code

/*
 * Primitive operations on long fixed point values.  If these are
 * reminiscent of assembler op codes it's only because some may
 * be replaced by inline assembler for particular machines someday.
 * These are the (kind of inefficient) run-anywhere versions.
 */
#define M_SUB(r_i, r_f, a_i, a_f) /* r -= a */ \
do { \
register u_int32 lo_tmp; \
register u_int32 hi_tmp; \
\
if ((a_f) == 0) { \
(r_i) -= (a_i); \
} else { \
lo_tmp = ((r_f) & 0xffff) + ((-((s_fp)(a_f))) & 0xffff); \
hi_tmp = (((r_f) >> 16) & 0xffff) \
    + (((-((s_fp)(a_f))) >> 16) & 0xffff); \
if (lo_tmp & 0x10000) \
hi_tmp++; \
(r_f) = ((hi_tmp & 0xffff) << 16) | (lo_tmp & 0xffff); \
\
(r_i) += ~(a_i); \
if (hi_tmp & 0x10000) \
(r_i)++; \
} \
} while (0)
/*
 * Operations on the long fp format
 */
#define L_SUB(r, a) M_SUB(r.l_ui, r.l_uf, a.l_ui, a.l_uf)

« 上次編輯: 2008-07-21 11:03 由 JonesLai »