gpt4 book ai didi

c - 使用全局变量而不是指针有优势吗?

转载 作者:太空宇宙 更新时间:2023-11-04 07:02:15 27 4
gpt4 key购买 nike

我遇到了一个 6k 行的源文件,它完全对全局变量起作用,并且有很多函数操作 void func(void) 但改变了全局变量。一些全局变量是具有结构的结构和指向函数的指针的结构,这使得即使是数据也很难很好地掌握。

代码难读、难维护、难测试,因为函数没有真正的接口(interface)描述,却“无处不在”。

现在我想知道是否有理由以这种方式编码(完全处理全局变量而不是使用指针作为参数)?它可能更快或更小,还是有其他好处可以使它比结构良好的指针函数更有用?

最佳答案

首先,没有理由在任何应用程序中使用全局的非常量变量。全局,因为对整个程序可用。

然而,在某些情况下,static 文件范围变量可能是有意义的。请注意,static 关键字阻止变量成为全局变量,它仅可用于声明它的翻译单元(意思是 c 文件加上包含的 header )。

此类设计有意义的一些示例:

  • 在设计自治代码模块(称它们为类、ADT 或其他)时,您可以确保只有一个实例存在,使用 static 文件范围变量可能会很方便,因为“穷人的 private”。一旦您向调用者提供某种 API,您几乎总是需要私有(private)的内部变量。

    这种做法常见于嵌入式系统单核编程。在桌面编程中则不然,可重入代码更为重要。

  • 特殊情况。在调用者和中断服务例程或回调函数之间共享变量时,参数传递可能不是一种选择。然后你别无选择,只能使用 static 文件范围变量。

    (此类变量也应声明为 volatile 以防止编译器优化器错误,以防编译器未意识到 ISR/回调已执行。)


您编写大于 2k LOC 的文件的唯一原因是您正在编写某种库,出于某种原因需要作为单个文件交付。例如,如果您正在编写标准 C 库的一个更复杂的库文件。

如果那不是您正在做的,永远没有任何借口来编写 6k LOC 文件,句号。更不用说用复杂的数据类型填充它了。

即使像上面的第一种情况一样编写内容,也没有什么能阻止您将文件分成几个。大多数情况下,它实际上是超过 2k LOC 的“main.c”,并且应该很容易拆分。

所以很遗憾,我怀疑您正在维护的代码是由初学者编写的。这并不罕见,几乎所有作为专业程序员工作的人都会在头 5 年左右写出这样的怪物。因为声音程序设计是您主要通过经验学习的东西。

关于c - 使用全局变量而不是指针有优势吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36615960/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com