【问题标题】:Extern, headers, global variables外部、标头、全局变量
【发布时间】:2014-09-24 10:14:05
【问题描述】:

我在做一个游戏,我的程序目前的结构如下...

我遇到的问题是我在init_game.c 中有一个函数,它使用必要的数据初始化玩家板,一旦我有了这些初始化板,我需要the_game.c 来使用这些初始化板(来自init_game.c )。

我很困惑如何让它与extern's 一起工作

编辑: 澄清 - 我想知道如何在我的程序结构中使用 extern 关键字,以允许我使用播放器初始化 2D char文件the_game.c中的数组(在文件init_game.c中初始化,但首先在attributes.h文件中定义)

在下面添加了一张图片以澄清我的问题...

【问题讨论】:

  • main 中全局定义这些变量,并在main 中包含attribute.h
  • 我不确定你的意思,我的游戏功能在the_game.c 中,所以在main 中包含attributes.h 将毫无用处。我的问题可能不清楚,我对如何以我提到的方式使用extern 感到困惑(使用来自一个文件的初始化变量,在另一个文件中)。
  • 您应该添加一个名为globals.c(即#include attributes.h)的文件,在其中放置这些全局变量的实际定义和初始化。

标签: c header global-variables extern


【解决方案1】:

这清楚地表明您的程序设计存在缺陷。正确的解决方案是修复程序设计,而不是使用全局变量实现意大利面条式编码。

使用它的最佳方法是使用面向对象的设计,通过创建“类”或“ADT”或“代码模块”(这些东西在 C 中基本上意味着相同的东西,因为没有 class 关键字)。每个这样的类都由一个 .h 文件和一个 .c 文件组成。使用保持类自治的面向对象的概念,只做他们的特定任务而不关心世界的其他部分。使用私有封装,将所有要视为公共的内容放在 .h 文件中。

  • Game 是您项目中的一个类。因此,与游戏相关的所有内容都应属于该类。
  • 初始化游戏肯定与游戏类有关,因此代码应与game.h 合并。将它放在自己的文件中是没有意义的。
  • 如果这些文件中的任何一个包含不属于游戏类的项目,则需要将这些项目移动到它们自己的文件中。
  • 如果游戏类被证明过于复杂(很可能如此),您需要将游戏的各种属性拆分为子类。例如,一类处理板子,一类处理球员等等。
  • 如果您的程序设计正确,那么任何地方都不应该有任何全局变量。如果您发现自己使用了 extern 关键字,那么您的程序设计就有缺陷。请注意,静态文件范围变量非常适合使用(尽管考虑线程安全问题)。

【讨论】:

  • 我明白了,当我用 C 编程时,我总是发现很难正确拆分我的程序
【解决方案2】:

init_game.c中,声明全局变量,

char player_board[BOARD_SIZE][BOARD_SIZE];
char enemy_board[BOARD_SIZE][BOARD_SIZE];

任何包含attributes.h 的文件都可以访问这些数组,前提是该文件没有声明另一个具有相同名称的变量。

在您的main 中,您需要确保在从the_game.c 调用任何使用全局数组的函数之前从init_game.c 调用初始化函数。

【讨论】:

  • 好的,那么在the_game.c 中,我将如何访问这些数组?就像player_board[i][j]?我对extern 感到很困惑。
  • 您访问它的方式与访问任何相同类型的数组的方式相同。 extern 只是通知编译器该数组是在另一个编译单元中定义的,在本例中为 init_game.c
猜你喜欢
  • 1970-01-01
  • 2012-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-24
  • 2017-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多