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

问题描述 投票:1回答:2

我怎样才能用这个定义的类型?

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)'

c typedef type-definition
2个回答
3
投票

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]要知道如何称呼它,而是一个功能比你调用它)。


1
投票

假设:

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

workers是一种(说真的,对于一个类型的别名)。该my_workersworkers类型的对象。

所述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;
}

尝试。对我来说,它编译并没有警告,没有错误运行。

© www.soinside.com 2019 - 2024. All rights reserved.