我开始用Java编程,而且我是C/C++的新手,所以这对我来说是新的。typedef in C,这段代码是什么意思
在我的编码任务之一,我碰到的语法如下:
typedef void function_name (void *param);
我抬头的typedef做什么,我知道它的定义。但无法弄清楚上面的陈述意味着什么。
接下来,这是使我更困惑的代码。
static function_name some_func;
有人可以对此有所了解吗?
我开始用Java编程,而且我是C/C++的新手,所以这对我来说是新的。typedef in C,这段代码是什么意思
在我的编码任务之一,我碰到的语法如下:
typedef void function_name (void *param);
我抬头的typedef做什么,我知道它的定义。但无法弄清楚上面的陈述意味着什么。
接下来,这是使我更困惑的代码。
static function_name some_func;
有人可以对此有所了解吗?
只是为了确保我们在同一页面上。 typedef是一种创建实际引用旧类型的新类型的方法。例如,该线
typedef int time_t;
创建一个新的类型time_t
这只是该类型int
的别名。这对于应用程序开发非常有用,因为它允许我们封装类型。例如,现在让我们假设,在30年之后,我们意识到32位int类型不再足够大以存储时间值。有了良好的体系结构,我们可以改变这条线:
typedef long long int time_t;
理论上一切都会很好,很花哨!
回到最初的问题。你看到的这行是类似于这个的typedef,但是有一些奇怪的语法。这种奇怪的语法是一种键入函数指针的方法 - 什么是函数指针?函数指针是一种传递函数的方式,它允许代码调用一个函数,而不必知道函数是什么函数。
返回到typedef。它说“创建一个新类型function_name
,使得它是接受void*
作为输入并返回void的功能类别”。因此,新型号function_name
是满足这些要求的任何功能的类型(不返回任何内容,需要void*
)。它让我这样写代码:
typedef void function_name (void* data);
void my_function(void* data) // my_function has type function_name
{
printf("%p\n", data);
}
void invoke_twice(function_name fn, void* data)
{
fn(data); fn(data);
}
int main(int argc, char** argv)
{
invoke_twice(my_function, NULL); // my function _is_ a function
// should print
// 0x0
// 0x0
}
第二条语句
static function_name some_func;
有点不解我为什么会有人这样做。这是一种非常模糊的前向声明函数的方式。换句话说,这句话相当于
void some_func(void* data);
但是我是谁来判断其他代码。没有完整的上下文,很难推断此类设计决策背后的意图。
感谢您的详细解释! :) – pranav3688
这两个声明
typedef void function_name (void *param);
static function_name some_func;
相当于
static void some_func (void *param);
对于声明一个单一的功能,这是一个相当长的缠绕方法,但typedef
将简化声明一堆的功能相同形状:
static function_name func1;
static function_name func2;
static function_name func3;
static function_name func4;
这是否是声明清晰度的净收益尚不清楚。但是,一个更加复杂的函数声明很容易会有所帮助:
typedef struct some_st **(*func) (int v, char **a, int (*kw) (int p1, int p2));
这声明func
为指针,以它返回一个间接指针结构和功能需要3个参数,其中最后一个是一个函数指针的函数。
谢谢,这有助于..实际上{function_name}已被用于很多地方给定的代码。 – pranav3688
它是C还是C++?下定决心。 – Brian
其纯C,抱歉的混淆。 :) – pranav3688
http://stackoverflow.com/questions/840501/how-do-function-pointers-in-c-work –