C中的typedef,这段代码意味着什么

时间:2015-09-23 00:14:52

标签: c typedef

我开始用Java编程,而且我是C / C ++的新手,所以这对我来说是新的。

在我的一个编码作业中,我遇到了以下语法:

typedef void function_name (void *param);

我查了一下typedef的作用,我知道它的定义是什么。但无法弄清楚上述陈述的含义。

接下来,这是让我更加困惑的代码。

static function_name some_func;

有人可以对此嗤之以鼻吗?

2 个答案:

答案 0 :(得分:4)

这两个声明

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个参数,最后一个是函数指针。

答案 1 :(得分:1)

只是为了确保我们在同一页面上。 typedef是一种创建实际引用旧类型的新类型的方法。例如,行

typedef int time_t;

创建一个新类型time_t,它只是int类型的别名。这对于应用程序开发非常有用,因为它允许我们封装我们的类型。例如,我们现在假设,30年后,我们意识到32位int类型不再足以存储时间值。有了良好的架构,我们可以将该行更改为:

typedef long long int time_t;

从理论上讲,一切都会很好,花花公子!

回到原来的问题。你看到的一行是类似于这个的typedef,但有一些奇怪的语法。这种奇怪的语法是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);

但我是谁来判断其他代码。如果没有完整的背景,很难推断出这些设计决策背后的意图。