我希望能够从.c文件中的所有函数访问struct变量。 我假设方法是在任何函数之外将结构声明为静态。 我有这样的事情:
static struct gameBoard current_game_board;
int foo() {
current_game_board = { .x = 1, .y = 2 }
}
这会在'{'token'之前喊出“预期的表达”。当我尝试使用和int而不是struct gameBoard时,它可以工作。 它甚至可以用结构吗?有没有更好的方法来保存文件中的状态?
答案 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或更好的支持,但您尝试的事实表明您可能拥有它。