簡體   English   中英

理解此代碼需要幫助

[英]Need help in understanding this code

在一個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左右開始。

因為它是一個函數指針 該函數實際上並未在該點調用,它只是傳遞給gst_ebml_peek_id_length (稍后可能會使用正確的參數調用它)。

這是一個做類似事情的簡單示例:

#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)

傳遞給gst_ebml_peek_id_full()的參數是gst_ebml_read_peek()的函數指針,或者換句話說它只傳遞函數的句柄,以便gst_ebml_peek_id_full()可以使用正確的參數調用函數傳遞。

提供傳遞您自己/不同的函數實現的靈活性,該函數實現相同的gst_ebml_read_peek()原型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM