【发布时间】:2011-10-21 06:54:38
【问题描述】:
在一个 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_read_peek和(gpointer)之间有一个逗号。 -
写这段代码的人应该被带到外面枪杀。但我会尽力帮助你。
-
在没有相应数据类型的情况下给我们这样的代码并不是很有用。如果
GstPeekData是对象类型的typedef,则用它来转换函数指针是UB。 gcc 通常接受这样的东西,但这不是可移植的。
标签: c