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)
?您确实需要函数指针的名称。否则你会如何引用它?你不应该更改你发布的代码。现在其他读者将无法理解我的答案。