4

作为初学者,我到处阅读以避免过度使用全局变量。那么该怎么做呢?我的低技能失败了。我最终会传递大量结构,并且比使用全局变量更难阅读。啊,我的代码一团糟,有什么好的书/文章推荐可以指导这个问题/应用程序结构设计吗?

4

5 回答 5

9

根据您的变量在做什么,全局范围可能是最佳范围。(认为​​标志表示中断已经到达,并且应该在计算循环中间的方便时间处理。)

通过使用全局变量,小型实用程序通常会感觉更干净(我特别考虑小型语言解析器);但这使得将来将小型实用程序集成到更大的程序中变得更加困难。总是有取舍。

但是很有可能“正确的”数据组织不会觉得那么麻烦。如果您在此处发布代码,有人可能会建议更简洁的布局,但是当代码超出易于理解的小样本时,真正的问题就会出现。

我有很多最喜欢的编程风格书籍,但我认为解决这种情况的最好的书是Kernighan 和 Plauger的 The Elements of Programming Style。它很旧,很难找到,但是很短,很甜,很值得在某个地方找到。

它没有那么短,也没有那么甜美,但仍然非常值得找到Code Complete, 2nd edition。它更详细,提供更多代码,并提供设计软件所涉及的更多多样性。这很棒,但可能更令人生畏。

没有什么比学习大师更重要的了:Unix 环境中的高级编程,第 2 版中的代码非常出色,值得每个小时的学习。

而且,当然,总有经验,但这需要时间来获得。从自己的错误中吸取教训往往比从别人的错误中吸取教训更有效。所以坚持下去。:)

于 2010-08-02T10:01:48.573 回答
1

我建议Yourdon 和 Constantine 的Structured Design。一本按计算机标准计算的旧书(它有涉及磁带的示例!)但对您遇到的问题非常合理。

于 2010-08-02T09:49:02.873 回答
0

@PeterK问题是结构本身总是在C书籍中呈现为容器,可以多次声明/传递给不同的函数,这可能会让我感到困惑,我从没想过将它用作一个简单的全局实例容器(这可能使我的代码更具可读性)。

我正在编写 3 相电机控制应用程序来控制 1 个电机。根据您所写的内容,请检查我目前解决问题的想法是否正确:

  1. 根据函数 ex. 将一些全局信息打包在结构体中。(sInverterState、sButtonsState、sInverterParameters 等)
  2. 如果我编写菜单 UI,我可以在 C 文件中使用静态变量,并且在我只有 1 个 LCD 时不关心传递结构。我不想让它看起来像 GTK++。
  3. 编写 reetrant 代码还不适合我,为此目的它做得过火。
  4. 在 IT 领域获得适当的教育。

我最终可能会得到很多全局变量,但至少它们的包装和可读性都很好。

于 2010-08-02T10:31:03.100 回答
0

如果您的程序是那种全局变量感觉不那么糟糕的“小”项目,但您认为将来可能需要将其集成到更大的项目中,一个非常简单的解决方案是添加单个上下文指针参数到每个函数并将所有“全局”变量存储在其中。如果您总是将其命名为相同的东西,您甚至可以执行以下操作:

#define current_filename   context->current_filename
#define option_flags       context->option_flags

等等,并且您的代码看起来几乎与使用全局变量的外观相同,除了您可以在单个程序中拥有它的多个实例,将其集成到库中,等等,而无需大惊小怪。只需将这些定义保存在源模块使用的私有标头中,而不是公共接口标头中。

于 2010-08-02T10:21:25.210 回答
0

您可以使用以下两个选项来改善您的情况:

  1. 对于只读结构,具有可以使用 const 指针控制对数据的访问的函数:

    结构我的结构;

    const my_struct* GetMyStruct(void) const;

  2. 通过将全局结构声明为静态来限制其暴露。这样它就只有文件范围:

    静态 mystruct myStructInstance;

于 2010-08-02T09:49:42.403 回答