在函数之前有什么意义论证?

时间:2015-03-19 13:05:06

标签: c++ c openvswitch

当我看到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

如果FUNCTION的返回为int且ARG的类型为char,则宏将成为此形式。

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

在ovsrcu_postpone__方法之前,我无法捕捉到两个参数的作用。

2 个答案:

答案 0 :(得分: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 :(得分: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

Coma运算符从左到右评估表达式。因此,此代码将评估(void) sizeof((FUNCTION)(ARG), 1)(void) sizeof(*(ARG))并致电ovsrcu_postpone__((void (*)(void *))(FUNCTION), ARG)。这是一种安全检查。