函数前的参数有什么意义?
What meaning arguments before the function have?
当我看到 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))
通过搜索得到了多参数sizeof的意思
Why call sizeof operator with two arguments?
http://www.vxdev.com/docs/vx55man/diab5.0ppc/c-additi.htm#3001432
如果return的FUNCTION是int,ARG的类型是char,宏就是这样的形式
((void) 4, (void) 1, ovsrcu_postpone__((void (*)(void *))(function), arg))
我无法在 ovsrcu_postpone__ 方法之前捕捉到两个参数的作用。
那么让我们看看他们在源代码中给出的示例:
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)
.
相同的 return 值
来自宏定义:
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)
将扩展为三个逗号分隔的表达式,括在方括号中:
((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)
。这是一种安全检查。
当我看到 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))
通过搜索得到了多参数sizeof的意思
Why call sizeof operator with two arguments? http://www.vxdev.com/docs/vx55man/diab5.0ppc/c-additi.htm#3001432
如果return的FUNCTION是int,ARG的类型是char,宏就是这样的形式
((void) 4, (void) 1, ovsrcu_postpone__((void (*)(void *))(function), arg))
我无法在 ovsrcu_postpone__ 方法之前捕捉到两个参数的作用。
那么让我们看看他们在源代码中给出的示例:
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)
.
来自宏定义:
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)
将扩展为三个逗号分隔的表达式,括在方括号中:
((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)
。这是一种安全检查。