我怎样才能用这个定义的类型?
typedef void (*(workers[2]))(char *, char *, int);
我能明白,我将有workers
,这是array
two
,每一个点到一个pointers
,它接受提到的参数的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;
编译,我得到:error: cannot convert `void (**)(char*, char*, int)' to `void (* (*)[2])(char*, char*, int)'
workers
是针对类型“指针2元件阵列的功能以两个char *
和int
作为参数并返回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]
是一个函数类型,它利用参数一定的数量和类型,因此,最好应该在接口后面隐藏的孔中(即,传递w[i]
要知道如何称呼它,而是一个功能比你调用它)。
假设:
typedef void (*(workers[2]))(char *, char *, int);
workers my_workers;
该workers
是一种(说真的,对于一个类型的别名)。该my_workers
是workers
类型的对象。
所述my_workers
是两个指针的阵列,每个指向的功能。每个这样的函数接受提到的参数和返回void
。
试用
至于你的要求,我已经试过你的代码如下。
#include <stdio.h>
typedef void (*(workers[2]))(char *, char *, int);
void worker1(char * x, char * y, int z) {
printf("1: [%s] [%s] [%d]\n", x, y, z);
}
void worker2(char * x, char * y, int z) {
printf("2: [%s] [%s] [%d]\n", x, y, z);
}
int main() {
char sa[] = "here";
char sb[] = "there";
char sc[] = "everywhere";
char sd[] = "nowhere";
workers w;
w[0] = worker1;
w[1] = worker2;
(w[0])(sa, sb, 50);
(w[1])(sc, sd, 70);
return 0;
}
尝试。对我来说,它编译并没有警告,没有错误运行。