gpt4 book ai didi

c - 如何在 C 中使用这个定义的类型?

转载 作者:太空宇宙 更新时间:2023-11-04 01:17:25 24 4
gpt4 key购买 nike

如何使用这个定义的类型?

typedef void (*(workers[2]))(char *, char *, int);

我能理解的是,我将拥有workers,它是两个 指针数组 ,每个都指向一个 void,它接受提到的参数。

对吗?

试验 #1

void worker1(char * x, char * y, int z) {

}

void worker2(char * x, char * y, int z) {

}

然后在另一个空隙中,我做了:

workers w;
w[0] = worker1;
w[1] = worker2;

编译,我得到:错误:无法将 `void (**)(char*, char*, int)' 转换为 `void (* (*)[2])(char*, char*, int)'

最佳答案

workers 是“指向以两个 char * 和一个 int 作为参数的函数的指针的 2 元素数组类型的别名,并且返回 void”。

这是这个野兽在实践中的样子的例子。

void f0( char *foo, char *bar, int bletch )
{
// do something interesting with foo, bar, and bletch
}

void f1( char *foo, char *bar, int bletch )
{
// do something else interesting with foo, bar, and bletch
}

int main( void )
{
workers w = { f0, f1 }; // equivalent to void (*w[2])(char *, char *, int ) = { f0, f1 };

// call f0 through w:
w[0]( "blah", "blah", 1 );

// call f1 through w:
w[1]( "ugh", "blah", 2 );
...
}

workers typedef 基本上为复杂的、难以阅读的类型创建了一个较短的名称。实际上,最好只为函数类型创建一个 typedef,然后创建一个数组:

typedef (*worker)(char *, char *, int );
worker w[2] = { f0, f1 };

像这样声明的问题

workers w = { f0, f1 };

是不是很明显 w 有一个数组类型,所以初始化看起来很困惑。它还依赖于使用此类型的人知道它是特定大小的数组类型。我们称其为“抽象漏洞”,它们会导致困惑和维护问题。

你仍然需要知道每个 w[i] 都是一个函数类型,它接受一定数量和类型的参数,所以理想情况下它也应该隐藏在接口(interface)后面(即,你将 w[i] 传递给知道如何调用它的函数,而不是自己调用它)。

关于c - 如何在 C 中使用这个定义的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54540664/

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