在c文件中使用结构保存状态

在c文件中使用结构保存状态,c,struct,C,Struct,我希望能够从.c文件中的所有函数访问结构变量。 我假设方法是在任何函数外部将结构声明为静态。 我有这样的想法: static struct gameBoard current_game_board; int foo() { current_game_board = { .x = 1, .y = 2 } } 这会喊出“预期表达式在“{”标记之前”。当我尝试用and int而不是struct gameBoard进行相同操作时,它会工作。 甚至可以使用结构吗?有没有更好的方法跨文件保存状态

我希望能够从.c文件中的所有函数访问结构变量。 我假设方法是在任何函数外部将结构声明为静态。 我有这样的想法:

static struct gameBoard current_game_board;

int foo() {
    current_game_board = { .x = 1, .y = 2 }
}
这会喊出“预期表达式在“{”标记之前”。当我尝试用and int而不是struct gameBoard进行相同操作时,它会工作。
甚至可以使用结构吗?有没有更好的方法跨文件保存状态?

如果我理解正确,您基本上想要一个全局结构,您可以在任何地方写入,然后定义该结构并创建指向它的全局指针。将指针分配到任何地方,您可以在任何地方使用它:

#include <stdio.h>
#include <stdlib.h>

typedef struct gameBoard {
    int a;
    int b;
} gameBoard;

gameBoard *current_gameboard;    /* declare global pointer */

void prngameboard ()
{
    printf ("\ncurrent_gameboard-> a: %d\ncurrent_gameboard-> b: %d\n\n",
            current_gameboard-> a, current_gameboard-> b);
}

void setgameboard (int x, int y)
{
    current_gameboard-> a = x;
    current_gameboard-> b = y;
}

int main () {

    /* allocate memory for pointer */
    current_gameboard = malloc (sizeof *current_gameboard);

    current_gameboard-> a = 1;
    current_gameboard-> b = 2;

    prngameboard ();
    setgameboard (3, 4);
    prngameboard ();

    /* free memory allocated to pointer */
    if (current_gameboard)
        free (current_gameboard);

    return 0;
}

注意:您应该始终检查
malloc
的返回,并在使用前测试
current\u gameboard
是否已分配。为了简洁起见,两者都已省略。如果您有问题,请告诉我。

初始值设定项列表用于初始化对象。初始化是在定义变量和在同一个go中显式地为其赋值。 由于您已经在块外部定义了变量,因此不能以这种方式使用初始值设定项列表。请改为:

current_game_board.x = 1;
current_game_board.y = 2;
正如@UnderDog所指出的,您误解了
static
的含义。
static
对于文件范围内的变量,表示它具有内部链接,即它仅限于当前翻译单元,并且在外部不可见

您想要的是将变量放在文件范围内,这在没有
static
限定符的情况下也可以工作。不过,您选择
static
是正确的,因为您应该限制从外部访问不需要的所有内容。您这样做的原因是错误的。

您可以使用:

static struct gameBoard current_game_board;

void foo(void) {
    current_game_board = (struct gameBoard){ .x = 1, .y = 2 };
}
这将为全局变量指定适当类型的“复合文字”

唯一的选择是:

static struct gameBoard current_game_board = { .x = 1, .y = 2 };

这些需要C99或更好的支持,但您正在尝试的事实表明您可能已经具备了这一点。

初始化器列表用于初始化。这不是初始化。而是单独设置每个成员。此处的static并不表示您认为它的意思。它意味着声明和变量将仅在一个编译器中可见变量单位。@UnderDog我想要的正是这个-一个只有在当前变量中才能看到的变量file@Jenian:好的。问题陈述中肯定没有明确说明这一点。如果这是你想要的,静态是一种方式。
static struct gameBoard current_game_board = { .x = 1, .y = 2 };