[英]Initialize Static Array of Structs in C
我在C中实现了一个纸牌游戏。有很多类型的卡片,每个都有一堆信息,包括一些需要单独编写脚本的动作。
给定这样的结构(我不确定我的函数指针是否正确)
struct CARD {
int value;
int cost;
// This is a pointer to a function that carries out actions unique
// to this card
int (*do_actions) (struct GAME_STATE *state, int choice1, int choice2);
};
我想初始化一个静态数组,每个卡一个。 我猜这看起来像这样
int do_card0(struct GAME_STATE *state, int choice1, int choice2)
{
// Operate on state here
}
int do_card1(struct GAME_STATE *state, int choice1, int choice2)
{
// Operate on state here
}
extern static struct cardDefinitions[] = {
{0, 1, do_card0},
{1, 3, do_card1}
};
这是否有效,我是否正确地采用这种方式? 我试图避免大量的switch语句。
我是否需要提前定义'do_cardN'函数,或者是否有某种方法可以在结构的初始化中内联定义它们(类似于python中的lambda函数)?
我需要从另一个文件中对cardDefinitions进行只读访问 - 'extern static'是否正确?
我知道这是很多问题,但我对如何解决这个问题真的有些模糊。
谢谢。
编辑:
要清楚,我的目标是能够做类似的事情
int cost = cardDefinitions[cardNumber].cost;
要么
int result = cardDefinitions[cardNumber].do_action(state, choice1, choice2);
而不是在所有地方使用巨大的开关语句。
你的方法是完全正确的。
switch
语句的好方法。 extern
是你想要的,而不是static
。 改变你的身体:
struct CARD cardDefinitions[] = { {0, 1, do_card0}, {1, 3, do_card1} };
然后在适当的头文件中:
extern struct CARD cardDefinitions[];
你的方法是正确的,并且会有效。 您的函数指针语法是正确的,除了您不使用参数名称 - 只是类型:
int (*do_actions)(struct GAME_STATE *, int, int);
这应该工作正常。 如果你在每张卡上做一个,你似乎有很多功能,但也许这个特定的游戏需要这种控制水平
你不能内联定义它们,但你可以做一个前向声明。 您需要在struct initialization中执行&func_name
没有; extern
表示变量在另一个文件中声明,因此在该位置声明一个extern变量是没有意义的。 此外, static
意味着变量只能从当前文件访问,这与您想要的相反。 将它设为只读需要一个getter函数,但是如果你只是想让它可以从另一个文件访问它通常在这里声明它( struct cardDefinitions[] = {...}
)而在另一个文件中使用extern( extern struct cardDefinitions[];
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.