繁体   English   中英

在C中初始化结构的静态数组

[英]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}
};
  1. 这是否有效,我是否正确地采用这种方式? 我试图避免大量的switch语句。

  2. 我是否需要提前定义'do_cardN'函数,或者是否有某种方法可以在结构的初始化中内联定义它们(类似于python中的lambda函数)?

  3. 我需要从另一个文件中对cardDefinitions进行只读访问 - 'extern static'是否正确?

我知道这是很多问题,但我对如何解决这个问题真的有些模糊。

谢谢。

编辑:

要清楚,我的目标是能够做类似的事情

int cost = cardDefinitions[cardNumber].cost;

要么

int result = cardDefinitions[cardNumber].do_action(state, choice1, choice2);

而不是在所有地方使用巨大的开关语句。

你的方法是完全正确的。

  1. 这将起作用,并且是避免巨大的switch语句的好方法。
  2. 您无法在C中内联定义函数,它们每个都必须具有唯一的名称。
  3. 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);
  1. 这应该工作正常。 如果你在每张卡上做一个,你似乎有很多功能,但也许这个特定的游戏需要这种控制水平

  2. 你不能内联定义它们,但你可以做一个前向声明。 您需要在struct initialization中执行&func_name

  3. 没有; extern表示变量在另一个文件中声明,因此在该位置声明一个extern变量是没有意义的。 此外, static意味着变量只能从当前文件访问,这与您想要的相反。 将它设为只读需要一个getter函数,但是如果你只是想让它可以从另一个文件访问它通常在这里声明它( struct cardDefinitions[] = {...} )而在另一个文件中使用extern( extern struct cardDefinitions[];

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM