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

时间:2015-03-19 23:06:04

标签: c struct

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

static struct gameBoard current_game_board;

int foo() {
    current_game_board = { .x = 1, .y = 2 }
}

这会在'{'token'之前喊出“预期的表达”。当我尝试使用和int而不是struct gameBoard时,它可以工作。 它甚至可以用结构吗?有没有更好的方法来保存文件中的状态?

3 个答案:

答案 0 :(得分:0)

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

#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;
}

<强>输出

$ ./bin/struct_global

current_gameboard-> a: 1
current_gameboard-> b: 2

current_gameboard-> a: 3
current_gameboard-> b: 4

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

答案 1 :(得分:0)

初始化程序列表用于初始化对象。初始化是指定义变量并在同一个go中明确赋值。 由于您已经在块外部定义了变量,因此您无法使用初始化列表。这样做:

current_game_board.x = 1;
current_game_board.y = 2;

同样正如@UnderDog指出的那样,你误解了static的含义。 static表示文件范围内的变量表示它具有内部链接,即它仅限于当前的翻译单元,并且在外部不可见。

你想要的是在文件范围内使用变量,这也可以在没有static限定符的情况下工作。你选择static是正确的,因为你应该限制访问外部不需要的所有东西。你只是出错了。

答案 2 :(得分:0)

您可以使用:

static struct gameBoard current_game_board;

void foo(void) {
    current_game_board = (struct gameBoard){ .x = 1, .y = 2 };
}

这会分配一个&#39;复合文字&#39;适用于全局变量的类型。

只有一次的选择是:

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

这些需要C99或更好的支持,但您尝试的事实表明您可能拥有它。