0

以下代码片段中的指针函数声明允许我改变结构内每个函数的名称,对吗?这只是假设性的,因此名称还没有意义。

头文件

typedef struct
{
    bool (*enabled)(uint32_void);
    void (*start)(uint32_t);
    void (*stop)(uint32_t);
    bool (*expired)(void);
} battle_star_gallactica;

C 文件

static bool Battle_v0_enabled (void) { ... }
static void Battle_v0_start (uint32_t) { ... }
static void Battle_v0_stop (uint32_t) { ... }
static bool Battle_v0_stop (void) { ... }

const battle_star_gallactica battle_v0 =
{
    enabled,
    start,
    stop,
    expired
};
...

一个示例使用

battle_v0.start(1000);

对于其他版本(例如 v1 或 v2 而不是 v0),将重复 C 文件片段。

这是如何运作的?

编辑

更正的代码:

头文件

typedef struct
{
    bool (*enabled)(uint32_void);
    void (*start)(uint32_t);
    void (*stop)(uint32_t);
    bool (*expired)(void);
} battle_star_gallactica;

extern const battle_star_gallactica battle_v0;
extern const battle_star_gallactica battle_v1;
...

C 文件

static bool Battle_v0_enabled (void) { ... }
static void Battle_v0_start (uint32_t val) { ... }
static void Battle_v0_stop (uint32_t val) { ... }
static bool Battle_v0_expired (void) { ... }

const battle_star_gallactica battle_v0 =
{
    Battle_v0_enabled,
    Battle_v0_start,
    Battle_v0_stop,
    Battle_v0_expired
};
...

一个示例使用

battle_v0.start(1000);
4

3 回答 3

2

是的。但是你有几个问题:

1) Battle_v0_stop 定义了两次 2) 初始化时battle_v0,您需要在值前加上前缀Battle_v0_

然后你可以这样做:

battle_v0.enabled()

但我会有 currnet battle star galactic并使用它:

const battle_star_gallactica bsg = battle_v0;
bgs.enabled()
于 2013-01-27T00:18:52.720 回答
1

您必须将目标函数分配给每个函数指针,例如

battle_v0.enabled = Battle_V0_enabled;
battle_v0.start   = Battle_V0_start;
// etc.

或者

const battle_star_galactica battle_v0 = {
    Battle_V0_enabled,
    Battle_V0_start,
    Battle_V0_stop,
    Battle_V0_expired
};

然后就可以通过指针调用函数了:

battle_v0.start(1000);  // or battle_v0.(*start)(1000)

将调用Battle_V0_start值为 1000 的函数。

请注意,函数签名(返回类型和参数的数量/类型)必须匹配;例如,您将函数指针声明为start接受 type 的参数uint32_t,但Battle_V0_start不接受任何参数。其中一个或另一个需要更改以使其匹配。

void Battle_V0_start(uint32_t val) { ... }
于 2013-01-27T00:46:44.780 回答
1

您没有名为enabledstart等的函数。当用函数指针初始化一个对象时,传递一个指向实际函数名的指针(即Battle_v0_start)。也就是说,重要的是要注意您的类型不匹配。应该是Battle_v0_start(uint32_t),不是void

但是,是的,在正确初始化后,您将能够简单地调用your_obj.your_struct_function_name(your_arguments, ...). 在您的情况下battle_v0.start(1000)将调用Battle_v0_start(如果您将此函数传递给指针)。您可以将其视为大多数其他指针类型。

于 2013-01-27T00:17:43.713 回答