如何避免C中的全局变量?

时间:2010-08-02 09:41:27

标签: c globals

作为初学者我到处阅读以避免过度使用全局变量。那该怎么办?我的低技能失败了。我结束了大量的结构,并且比使用全局变量更难阅读。我的代码是不是很好的书/文章推荐,指导通过这个问题/应用程序结构设计?

5 个答案:

答案 0 :(得分:8)

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

通过使用全局变量(我特别想到小语言解析器),小实用程序通常会感觉更清晰;但是这使得将小型实用程序集成到更大的程序中变得更加困难。总是有权衡。

但是,“正确”的数据组织可能不会那么繁琐。如果你在这里发布代码,有人可能会建议更清晰的布局,但是当代码增长超出容易理解的小样本时,真正的问题就出现了。

我有很多喜欢的编程风格的书籍,但我认为我所知道的最好的解决这种情况的是The Elements of Programming Style,Kernighan和Plauger。它很老,而且很难找到,但很短,很好,而且值得在某处使用。

它不是那么短,它不是那么甜,但仍值得找Code Complete, 2nd edition。它更加详细,提供了更多的代码,并且在设计软件时提供了更多的多样性。它很棒,但可能更令人生畏。

没有什么比研究大师更好的了:Advanced Programming in the Unix Environment, 2nd Edition中的代码是惊人的,值得每小时学习。

当然,总有经验,但这需要时间来获得。从自己的错误中吸取教训往往比从其他人的错误中吸取教训要强大得多。所以坚持下去。 :)

答案 1 :(得分:1)

我建议由Yourdon和Constantine提出结构化设计。一本旧书按计算机标准(它有一些涉及磁带的例子!),但对你遇到的问题非常合理。

答案 2 :(得分:0)

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

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

    struct my_struct;

    const my_struct * GetMyStruct(void)const;

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

    static mystruct myStructInstance;

答案 3 :(得分:0)

如果你的程序是那种全局变量并不那么糟糕的“小”项目,但你认为将来可能需要将它集成到一个更大的项目中,一个非常简单的解决方案就是添加一个每个函数的上下文指针参数,并将所有“全局”变量存储在那里。如果你总是把它命名为同样的东西,你甚至可以做这样的事情:

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

等。并且你的代码看起来与使用全局变量看起来几乎完全相同,除了你可以在一个程序中拥有它的多个实例,将它集成到一个库中,等等,并且最小化。只需将这些定义保留在源模块使用的私有头中,而不是公共接口头。

答案 4 :(得分:0)

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

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

  1. 根据功能ex在结构中打包一些全局信息。 (sInverterState,sButtonsState,sInverterParameters等)
  2. 如果我编写菜单UI,我可以在C文件中使用静态变量,并且在我只有1个LCD时不关心传递结构。我不想让它看起来像GTK ++。
  3. 编写reetrant代码对我来说并不适用于此目的。
  4. 在IT领域接受适当的教育。
  5. 我最终可能会有很多全局变量,但至少它们包装得很好且可读。