gpt4 book ai didi

c - typedef 一个函数接口(interface)(不是函数指针)

转载 作者:太空狗 更新时间:2023-10-29 15:47:37 25 4
gpt4 key购买 nike

如果我这样输入定义:

typedef int (read_proc_t)(char *page, char **start, off_t off,
int count, int *eof, void *data);

定义here

这种技术叫什么?

如果我以这种方式进行 typedef,这意味着我创建了一个类型 read_proc_t;稍后,我创建了我自己的 read-proc-t 版本,即 my_read_proc 并且我有一个这样的结构:

struct test {
read_proc_t read_proc;
}

struct test t;

我可以这样做:

t.read_proc_t = my_read_proc;

这是正确的吗?通常,如果我将 read_proc_t 类型定义为函数指针:

typedef int (*read_proc_t)(char *page, char **start, off_t off,
int count, int *eof, void *data);

我必须将 my_read_proc 函数地址分配给函数指针,如下所示:

(*t.read_proc_t) = &my_read_proc;

我在什么情况下选择一个?

最佳答案

不同之处在于,在第一种情况下,read_proc_t 类型没有获得隐式指针语义,而在第二种情况下,它变成了指针类型。

两者的区别是第一种类型的变量在大多数情况下是不能创建的。例如,这样定义 struct 是非法的:

struct test {
// This causes an error in C99:
// field ‘read_proc’ declared as a function
read_proc_t read_proc;
};

您需要一个星号才能使其有效:

struct test {
read_proc_t *read_proc;
};

但是,read_proc_t 可用于声明函数参数:

void read_something(read_proc_t rd_proc) {
rd_proc(...); // Invoke the function
}

read_proc_tread_proc_t*有一定的互换性:比如你可以这样调用上面的函数:

read_proc_t *rd = my_read_01;
read_something(rd); // <<== read_proc_t* is passed to read_proc_t

一般来说,您应该更喜欢第一个声明来保持函数指针语义明确,因为它更利于可读性。如果您使用第二个声明(带星号),您应该以告诉读者它是一个指针的方式命名该类型,例如,像这样:

typedef int (*read_proc_ptr_t)(char *page, char **start, off_t off,
int count, int *eof, void *data);

关于c - typedef 一个函数接口(interface)(不是函数指针),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23062375/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com