2015-03-19 58 views
1

當我看到OVS源代碼時,發現了我以前從未見過的非常奇怪的代碼。函數之前有什麼含義參數?

https://github.com/openvswitch/ovs/blob/master/lib/ovs-rcu.h

void ovsrcu_postpone__(void (*function)(void *aux), void *aux); 
#define ovsrcu_postpone(FUNCTION, ARG)       \ 
    ((void) sizeof((FUNCTION)(ARG), 1),       \ 
    (void) sizeof(*(ARG)),          \ 
    ovsrcu_postpone__((void (*)(void *))(FUNCTION), ARG)) 

我通過搜索

Why call sizeof operator with two arguments? http://www.vxdev.com/docs/vx55man/diab5.0ppc/c-additi.htm#3001432

IF函數的返回是int和ARG的類型爲char了多參數的含義的sizeof,宏觀變成這種形式。

((void) 4, (void) 1, ovsrcu_postpone__((void (*)(void *))(function), arg)) 

我無法在ovsrcu_postpone__方法之前捕捉到兩個參數的角色。

+2

它看起來像一種方法來檢查'FUNCTION'和'ARG'類型的兼容性,然後丟棄它們的類型(通過在未評估的表達式'sizeof'中使用它們,它在運行時不做任何事情,但必須通過typechecker)。一種「通用編程」。 – Mankarse 2015-03-19 13:10:22

回答

3

那麼讓我們來看看他們在源代碼中給出的例子:

ovsrcu_postpone(free, ovsrcu_get_protected(struct flow *, &flowp)); 

這將擴大到:

(
(void) sizeof((free)(ovsrcu_get_protected(struct flow *, &flowp)), 1), 
(void) sizeof(*(ovsrcu_get_protected(struct flow *, &flowp))), 
ovsrcu_postpone__((void (*)(void *))(free), ovsrcu_get_protected(struct flow *, &flowp)) 
) 

所以我們這裏有什麼,是某種類型的安全性,然後是預期的呼叫。這裏是我可以梳理出的要求:

  • 第一個參數是一個帶有一個參數的函數。
  • 第二個參數至少有一個間接級別(它是一個指針)。

我們也可以明白這一點:

sizeof(free, 1); 

這是使用逗號操作符,所以比確保語法是有效的其他,它將具有相同的返回值sizeof(1)

1

從宏定義:

void ovsrcu_postpone__(void (*function)(void *aux), void *aux); 
#define ovsrcu_postpone(FUNCTION, ARG)       \ 
    ((void) sizeof((FUNCTION)(ARG), 1),       \ 
    (void) sizeof(*(ARG)),          \ 
    ovsrcu_postpone__((void (*)(void *))(FUNCTION), ARG)) 

我們可以推斷出ovsrcu_postpone(FUNCTION, ARG)將擴大到括號anclosed 3昏迷分開的表達式:

((void) sizeof((FUNCTION)(ARG), 1),       \ 1 
    (void) sizeof(*(ARG)),          \ 2 
    ovsrcu_postpone__((void (*)(void *))(FUNCTION), ARG))  \ 3 

昏迷運算符計算開始從左至右表達式。因此,此代碼將評估(void) sizeof((FUNCTION)(ARG), 1)(void) sizeof(*(ARG))並致電ovsrcu_postpone__((void (*)(void *))(FUNCTION), ARG)。這是安全檢查的類型。

相關問題