2015-03-19 56 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)。这是安全检查的类型。

相关问题