У вас есть два варианта - небрежный, но легкий, или точный, но кропотливый.
Слоппи
typedef struct{
char *ename;
char *pname[3];
void (*function)(); // Pointer to function taking indeterminate arguments
} Example;
Example ex[3] =
{
{ "func1", { "x", }, func1 },
{ "func2", { "x", "y", }, func2 },
{ "func3", { "x", "y", "z", }, func3 },
};
Это не проходит, если вы компилируете с -Wstrict-prototypes
в GCC. Обратите внимание, что я позаботился о том, чтобы было место для имен параметров - у вашего оригинала было char **pname
, что означало бы, что вы должны выделить хранилище для массивов, прежде чем присваивать им имена.
1010 * кропотливая *
typedef struct{
char *ename;
char *pname[3];
union
{
void (*f1)(int x);
void (*f2)(int x, int y);
void (*f3)(int x, int y, int z);
} u;
} Example;
Example ex[3] =
{
{ "func1", { "x", }, .u.f1 = func1 },
{ "func2", { "x", "y", }, .u.f2 = func2 },
{ "func3", { "x", "y", "z", }, .u.f3 = func3 },
};
При инициализации используются обозначенные C99 инициализаторы. Каждому указателю функции присваивается правильно типизированный элемент объединения.