C 函数名随结构中指针的变化

C 函数名随结构中指针的变化,c,C,下面代码片段中的指针函数声明允许我更改结构中每个函数的名称,对吗?这仅仅是假设,因此这些名字还不重要 头文件 typedef struct { bool (*enabled)(uint32_void); void (*start)(uint32_t); void (*stop)(uint32_t); bool (*expired)(void); } battle_star_gallactica; static bool Battle_v0_enabled (vo

下面代码片段中的指针函数声明允许我更改结构中每个函数的名称,对吗?这仅仅是假设,因此这些名字还不重要

头文件

typedef struct
{
    bool (*enabled)(uint32_void);
    void (*start)(uint32_t);
    void (*stop)(uint32_t);
    bool (*expired)(void);
} battle_star_gallactica;
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);
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;
...
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);
C文件

typedef struct
{
    bool (*enabled)(uint32_void);
    void (*start)(uint32_t);
    void (*stop)(uint32_t);
    bool (*expired)(void);
} battle_star_gallactica;
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);
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;
...
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);
一个示例使用

typedef struct
{
    bool (*enabled)(uint32_void);
    void (*start)(uint32_t);
    void (*stop)(uint32_t);
    bool (*expired)(void);
} battle_star_gallactica;
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);
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;
...
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);
对于其他版本(例如v1或v2而不是v0),C文件片段将重复

这是怎么回事

编辑

更正代码:

头文件

typedef struct
{
    bool (*enabled)(uint32_void);
    void (*start)(uint32_t);
    void (*stop)(uint32_t);
    bool (*expired)(void);
} battle_star_gallactica;
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);
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;
...
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);
C文件

typedef struct
{
    bool (*enabled)(uint32_void);
    void (*start)(uint32_t);
    void (*stop)(uint32_t);
    bool (*expired)(void);
} battle_star_gallactica;
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);
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;
...
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);
一个示例使用

typedef struct
{
    bool (*enabled)(uint32_void);
    void (*start)(uint32_t);
    void (*stop)(uint32_t);
    bool (*expired)(void);
} battle_star_gallactica;
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);
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;
...
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);

您没有名为
启用
启动
等的函数。使用函数指针初始化对象时,传递一个指向实际函数名的指针(即
Battle\u v0\u start
)。也就是说,重要的是要注意您的类型不匹配。它应该是
Battle\u v0\u start(uint32\u t)
,而不是
void


但是,是的,在正确初始化之后,您将能够简单地调用
您的对象。您的\u结构\u函数\u名称(您的\u参数,…)
。在您的情况下,
battle\u v0.start(1000)
将调用
battle\u v0\u start
(如果您将此函数传递给指针)。您可以像大多数其他指针类型一样考虑这一点。

您没有名为
已启用
开始
等的函数。使用函数指针初始化对象时,传递一个指向实际函数名的指针(即
Battle\u v0\u start
)。也就是说,重要的是要注意您的类型不匹配。它应该是
Battle\u v0\u start(uint32\u t)
,而不是
void


但是,是的,在正确初始化之后,您将能够简单地调用
您的对象。您的\u结构\u函数\u名称(您的\u参数,…)
。在您的情况下,
battle\u v0.start(1000)
将调用
battle\u v0\u start
(如果您将此函数传递给指针)。您可以像大多数其他指针类型一样考虑这一点。

是的。但你有几个问题:

1) 战斗\u v0\u停止定义两次 2) 当初始化
battle\u v0
时,需要在值前面加上
battle\u v0

然后你可以做:

battle_v0.enabled()
但我会用currnet
战斗之星galactic
并使用它:

const battle_star_gallactica bsg = battle_v0;
bgs.enabled()

对。但你有几个问题:

1) 战斗\u v0\u停止定义两次 2) 当初始化
battle\u v0
时,需要在值前面加上
battle\u v0

然后你可以做:

battle_v0.enabled()
但我会用currnet
战斗之星galactic
并使用它:

const battle_star_gallactica bsg = battle_v0;
bgs.enabled()

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

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

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

battle_v0.start(1000);  // or battle_v0.(*start)(1000)
将调用值为1000的
Battle\u V0\u start
函数

请注意,函数签名(返回类型和参数的数量/类型)必须匹配;例如,您将
start
的函数指针声明为接受
uint32\u t
类型的参数,但
Battle\u V0\u start
不接受任何参数。其中一个需要更改,以便匹配

void Battle_V0_start(uint32_t val) { ... }

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

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

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

battle_v0.start(1000);  // or battle_v0.(*start)(1000)
将调用值为1000的
Battle\u V0\u start
函数

请注意,函数签名(返回类型和参数的数量/类型)必须匹配;例如,您将
start
的函数指针声明为接受
uint32\u t
类型的参数,但
Battle\u V0\u start
不接受任何参数。其中一个需要更改,以便匹配

void Battle_V0_start(uint32_t val) { ... }

“这么说我们大家”——意思是?@Biff-你看过新的“太空堡垒卡拉狄加”系列,对吗?哈哈,不,我是在“办公室”上听到的。很高兴知道。“我们大家都这么说”--意思是?@Biff-你看过新的“太空堡垒卡拉狄加”系列,对吗?哈哈,没有。我是在“办公室”上听到的。很高兴知道。指针的使用方式有名字吗?我打算在一本C语言书中读到更多关于它的内容,我只是把它们称为
函数指针
。看,指针的名称是否重要?例如,我是否可以只为第一个函数指针指定
void(*)(uint32\u t)
?您确实需要函数指针的名称。否则你会如何引用它?你不应该更改你发布的代码。现在,其他读者将无法理解我的答案。指针的使用方式有名字吗?我打算在一本C语言书中读到更多关于它的内容,我只是把它们称为
函数指针
。看,指针的名称是否重要?例如,我是否可以只为第一个函数指针指定
void(*)(uint32\u t)
?您确实需要函数指针的名称。否则你会如何引用它?你不应该更改你发布的代码。现在其他读者将无法理解我的答案。