繁体   English   中英

C 中的 typedef,这段代码是什么意思

[英]typedef in C, what does this code mean

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

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

typedef void function_name (void *param);

我查了一下 typedef 是做什么的,我知道它的定义是什么。 但无法弄清楚上面的陈述是什么意思。

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

static function_name some_func;

有人可以对此有所了解吗?

这两个声明

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声明为指向func的指针,该函数返回指向结构的间接指针,该函数接受 3 个参数,其中最后一个是函数指针。

只是为了确保我们在同一页面上。 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);

但我是谁来判断其他代码。 如果没有完整的上下文,就很难推断出此类设计决策背后的意图。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM