我创建了一个名为 variables.h 的头文件来存储要在程序中使用的所有变量。然后我将程序裁剪为单独的原型 .h 文件和 .c 文件。
我决定创建一个 variables.c 文件来定义变量。在 variables.h 中它们具有 extern 关键字,在 c 文件中它们被定义。但是当我在其他 c 文件中包含“variables.h”时,我得到了错误比如“缺少二元运算符”、“var_1 undefined”等。
建议??
我创建了一个名为 variables.h 的头文件来存储要在程序中使用的所有变量。然后我将程序裁剪为单独的原型 .h 文件和 .c 文件。
我决定创建一个 variables.c 文件来定义变量。在 variables.h 中它们具有 extern 关键字,在 c 文件中它们被定义。但是当我在其他 c 文件中包含“variables.h”时,我得到了错误比如“缺少二元运算符”、“var_1 undefined”等。
建议??
我有一个建议:利用范围。
编写良好的 C 程序很少需要很多全局变量,而编写良好的 C 程序所需的大多数全局变量只需要一个或两个 .c 文件。在大型程序的所有 .c 文件中使用相同的全局变量是没有意义的,因为这样您就失去了信息隐藏和模块化的好处。您的程序变得脆弱且难以更改,因为对程序一部分的更改会影响全局变量,从而影响整个程序的其余部分。
编辑:避免全局变量的建议
将代码分成模块,每个模块都有一项工作要做,然后在不依赖模块外部可见的任何全局变量的情况下实现该工作。请注意,完全不依赖任何全局变量也符合此标准,并且确实是首选。另外,我喜欢 StackOverflow 答案中给出的建议。
让我们看一个将程序划分为模块的快速示例。通常,一个用户可见的程序会有一些用户界面逻辑,一些业务逻辑,也许还有一个数据库连接覆盖。这些东西中的每一个都代表至少一个模块,可能是几个。作为我们的例子,让我们离开数据库,只考虑像 Unix 这样的程序wc
。它读取一个文件,计算字数并打印字数。很简单,对吧?好吧,即使是这个简单的程序也应该有一个用于解析命令行参数并将这些参数放入结构的模块,一个用于实际计算单词的模块,以及一个用于打印字数的模块。用户界面模块(在这种情况下,一个文件与main
function) 将命令行参数传递给解析器,解析器返回一个指向堆分配结构的指针,该结构包含有关命令行参数的信息。然后,主模块对命令行中找到的每个文件名调用一次字数统计模块,字数统计模块返回字数统计信息。然后,主模块调用打印模块,该模块使用命令行标志来确定要打印哪些信息以及如何格式化。
现在假设您已经设计了模块,并且每个模块都有一个或多个 .c 文件。您可能仍然需要一些全局状态。在这种情况下,每个模块的 .c 文件都应声明所有全局变量,除非模块有多个 .c 文件,否则整个项目中不应有其他文件使用该变量,无论是通过包含外部变量还是以其他方式。