理解此代码需要帮助

时间:2011-10-21 06:54:38

标签: c

在一个gstreamer-plugin中有一些代码:

static GstFlowReturn
gst_ebml_peek_id_full (GstEbmlRead * ebml, guint32 * id, guint64 * length,
    guint * prefix)
{
  GstFlowReturn ret;

  ret = gst_ebml_peek_id_length (id, length, prefix,
      (GstPeekData) gst_ebml_read_peek, (gpointer) gst_ebml_read_br (ebml),
      ebml->el, gst_ebml_read_get_pos (ebml));
  if (ret != GST_FLOW_OK)
    return ret;

  GST_LOG_OBJECT (ebml->el, "id 0x%x at offset 0x%" G_GINT64_MODIFIER "x"
      " of length %" G_GUINT64_FORMAT ", prefix %d", *id,
      gst_ebml_read_get_pos (ebml), *length, *prefix);

现在看到gst_ebml_peek_id_length ()的第4个参数是

(GstPeekData) gst_ebml_read_peek

其中gst_ebml_read_peek是另一个函数,其定义为:

static const guint8 *
gst_ebml_read_peek (GstByteReader * br, guint peek)
{
  const guint8 *data = NULL;

  if (G_LIKELY (gst_byte_reader_peek_data (br, peek, &data)))
    return data;
  else
    return NULL;
}

现在我想问你的是:gst_ebml_read_peek在定义中有两个输入参数,那么如何在没有参数的情况下调用它(在上面的代码中)?

编辑: 你可以在这里找到这个代码 http://gstreamer.freedesktop.org/data/coverage/lcov/gst-plugins-good/gst/matroska/ebml-read.c.gcov.html

从第194行附近。

3 个答案:

答案 0 :(得分:8)

因为它是function pointer。该函数实际上并未在该点被调用,它只是传递给gst_ebml_peek_id_length(稍后可能会使用正确的参数调用它)。

答案 1 :(得分:3)

这是一个做类似事情的简单例子:

#include <stdio.h>

typedef int (*binaryop)(int, int);

static int add(int a, int b) {
  return a + b;
}

static int mul(int a, int b) {
  return a * b;
}

static void print_result(binaryop op, int a, int b) {
  printf("%d\n", op(a, b));
}

int main() {
  print_result(add, 2, 3);
  print_result(mul, 5, 7);
  return 0;
}

print_result函数将另一个函数作为参数,然后调用它。如果只编写add而没有括号,则尚未调用该函数。它仅在函数调用表达式中调用,如下所示:function_name(arguments)

答案 2 :(得分:1)

传递给gst_ebml_peek_id_full()的参数是gst_ebml_read_peek()的函数指针,或者换句话说它只是传递函数的句柄,这样gst_ebml_peek_id_full()就可以使用正确的参数调用函数传递。

灵活地传递您自己的/不同的函数实现,它实现了相同的gst_ebml_read_peek()原型。