意外62,我认为您的困惑源于struct
. 你认为那foo
是 typeint
吗?
我们有:
static struct sample_struct {
int command;
int (*foo)( obj1 *banana, int num);
} sample_struct_table[] = {
{ .command = COMMAND_1,
.foo = function_name,
},
{ .command = COMMAND_2,
.foo = another_function_name,
},
};
typedef
我们可以使用s稍微重写一下。第一步:
typedef struct _sample_t
{
int command;
int (*foo)( obj1 *banana, int num);
} sample_t;
从那里到第二个:
typedef int (*foo_t)( obj1 *banana, int num);
typedef struct _sample_t
{
int command;
foo_t foo;
} sample_t;
foo
如果您是 C 的新手,这应该可以更清楚地了解类型是什么。
现在,即使您声明和初始化了数组,您最终还是将数组初始化为两个函数的地址以及后面的文字COMMAND_1
和 和COMMAND_2
。
现在假设您有以下程序(我即兴使用了这些值),您可以看到如何在函数for
体的循环内调用main()
函数。
#include <stdio.h>
#include <stdlib.h>
#define COMMAND_1 1
#define COMMAND_2 2
typedef void* obj1;
static int function_name(obj1 *banana, int num);
static int another_function_name(obj1 *banana, int num);
typedef int (*foo_t)( obj1 *banana, int num);
typedef struct _sample_t
{
int command;
foo_t foo;
} sample_t;
sample_t sample_struct_table[] = {
{ .command = COMMAND_1,
.foo = function_name,
},
{ .command = COMMAND_2,
.foo = another_function_name,
},
};
static int function_name(obj1 *banana, int num)
{
// do stuff here
// When does this get called?
return 0;
}
static int another_function_name(obj1 *banana, int num)
{
// do stuff here
// When does this get called?
return 0;
}
int main(int argc, char** argv)
{
int i;
for(i = 0; i < sizeof(sample_struct_table)/sizeof(sample_struct_table[0]); i++)
{
printf("%i\n", i);
if(sample_struct_table[i].foo(NULL, i))
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
TL;博士:
调用一个函数,不像在 Pascal 中,总是需要说function_name(...)
,而function_name
仅仅引用那个函数的地址。