workers
- это псевдоним для типа "массив из двух элементов с указателями на функции, принимающий два 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 (*worker)(char *, char *, int );
worker w[2] = { f0, f1 };
Проблема с объявлением типа
workers w = { f0, f1 };
что не сразу очевидно, что w
имеет тип массива, поэтому инициализация выглядит запутанной.Он также полагается на человека, использующего этот тип, чтобы знал , что это тип массива определенного размера.Мы называем это «утечка абстракции», и они приводят к путанице и головной боли обслуживания.
Вы все еще должны знать, что каждый w[i]
является типом функции, который принимает определенное число и тип аргументов, поэтому в идеале он также должен быть скрыт за интерфейсом (т. Е. Вы передаете w[i]
вфункция, которая знает, как вызывать ее, а не вызывать ее самостоятельно).