[英]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.