【问题标题】:Typedef with function pointers in C?Typedef与C中的函数指针?
【发布时间】:2012-01-17 03:49:58
【问题描述】:
我是 C 的新手,我很难阅读这行代码并理解它:
typedef void (*getnxtbyte_t)(void *stream);
环顾四周,我现在知道这是一个指向函数的指针。但是任何人都可以帮助我进一步澄清这一点吗?这种新类型的名称是什么?它指向什么功能?函数的参数是(void* stream)吗?
提前致谢!
【问题讨论】:
标签:
c
function-pointers
typedef
【解决方案1】:
这是一个很难习惯的语法。
这种新类型的名称是什么?
类型是getnxtbyte_t。 (您可以将结尾的 _t 读作“类型”。这是一种流行的约定。)
getnxtbyte_t 类型的变量可以保存一个函数的地址,该函数接受一个void * 参数并返回类型为void。
它指向什么函数?
错误的问题。
该代码仅定义类型。没有变量被创建,所以没有“它”指向任何东西。
如果您知道具有正确签名的函数,例如:
void some_func(void*) {}
您现在可以使用该 typedef 创建指向它的指针:
getnxtbyte_t my_function_pointer = some_func;
【解决方案2】:
这个typedef 创建了一个名为getnxtbyte_t 的类型。该类型用于指向返回void(即什么都没有)的函数的指针,如第二个单词所示。该函数采用单个参数,即void *,由stream 显示。
如果你有一个声明如下的函数:
void some_function(void *any_name);
然后您可以使用typedef,就像您帖子中的那样:
void *some_param = NULL;
typedef void (*getnxtbyte_t)(void *stream); // declare typedef
getnxtbyte_t func = some_function; // assign
func(some_param); // call
【解决方案3】:
函数指针类型名称为getnxtbyte_t。它现在没有指向任何东西——这是一个 type 的指针,而不是一个实际的指针。就像说
typedef struct foo {int x;} Foo;
您定义了一个类型Foo,但没有该类型的实际实例。最后,是的,该函数接受一个 void* 参数,并返回 void。
【解决方案4】:
我也是C新手,如有错误请指正。
指向函数的指针格式如下:
datatype (*POINTER_NAME)(PARAMETERS);
这就是指向函数返回的数据类型、指针的名称和指向函数采用的参数。
以下是函数指针与普通函数声明相比的外观:
// normal function declaration
void getnxtbyte_t(void *stream);
// function pointer
void (*getnxtbyte_t)(void *stream);
typedef 允许我们创建自己的类型。
// will create a type called getnxtbyte_t
typedef void (*getnxtbyte_t)(void *stream);
此时我们只声明了一个类型;我们没有指向任何东西。所以让我们创建一个名为func_ptr 的指针并将其指向一个函数。
// func_ptr is a pointer of type getnxtbyte_t
getnxtbyte_t func_ptr = another_function;
// calling func_ptr is now the same as calling another_function
func_ptr(an_argument);
// had we not used typedef, we would type:
void (*getnxtbyte_t)(void *stream) = another_func;
getnxtbyte_t(an_argument);