予期しない62、あなたの混乱はの定義から生じていると思いますstruct
。おそらくそれfoo
はタイプだと思いますか?int
我々は持っています:
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,
},
};
sを使用してこれを少し書き直すことができtypedef
ます。最初の一歩:
typedef struct _sample_t
{
int command;
int (*foo)( obj1 *banana, int num);
} sample_t;
そしてそこから、2番目:
typedef int (*foo_t)( obj1 *banana, int num);
typedef struct _sample_t
{
int command;
foo_t foo;
} sample_t;
foo
これにより、Cを初めて使用する場合は、タイプが何であるかがより明確になります。
これで、配列の宣言と初期化を行っても、2つの関数のアドレスに加えて、それぞれの背後にあるリテラルに配列が初期化されます。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; DR:
Pascalとは異なり、関数を呼び出すには常に言う必要がありますがfunction_name(...)
、function_name
単にその関数のアドレスを参照するだけです。