头文件中的变量将共享给多个.c文件

头文件中的变量将共享给多个.c文件,c,header-files,C,Header Files,我创建了一个名为variables.h的头文件来存储程序中要使用的所有变量。然后我将程序裁剪成单独的prototype.h文件和.c文件 我决定创建一个variables.c文件来定义变量。在variables.h中,它们有extern关键字,在c文件中定义了它们。但是,当我在其他c文件中包含“variables.h”时,会出现诸如“缺少二进制运算符”、“var_1未定义”等错误 建议???我有一个建议:利用范围 编写良好的C程序很少需要许多全局变量,而编写良好的C程序所需要的大多数全局变量只需

我创建了一个名为variables.h的头文件来存储程序中要使用的所有变量。然后我将程序裁剪成单独的prototype.h文件和.c文件

我决定创建一个variables.c文件来定义变量。在variables.h中,它们有extern关键字,在c文件中定义了它们。但是,当我在其他c文件中包含“variables.h”时,会出现诸如“缺少二进制运算符”、“var_1未定义”等错误


建议???

我有一个建议:利用范围

编写良好的C程序很少需要许多全局变量,而编写良好的C程序所需要的大多数全局变量只需要一个或两个.C文件。在大型程序中的所有.c文件中使用相同的全局变量是没有意义的,因为这样会失去和的好处。您的程序变得脆弱且难以更改,因为对程序一部分的更改会影响全局变量,从而影响整个程序的其余部分


编辑:避免全局变量的建议

将代码划分为每个模块都有一个作业要做,然后在不依赖模块外部可见的任何全局变量的情况下实现该作业。请注意,完全不依赖任何全局变量也符合这一标准,而且确实是首选。此外,我喜欢答案中给出的建议

让我们看一个将程序划分为模块的快速示例。通常,一个用户可见的程序会有一些用户界面逻辑、一些业务逻辑,可能还有一个数据库连接覆盖。这些东西中的每一个都至少代表一个模块,可能是几个。作为我们的例子,让我们离开数据库,只考虑一个程序,如UNIX <代码> WC。它读取文件,计算字数,并打印字数。很简单,对吧?即使是这个简单的程序也应该有一个模块用于解析命令行参数并将这些参数放入结构中,一个模块用于实际计算单词数,另一个模块用于打印单词数。用户界面模块(在本例中,一个带有
main
函数的文件)将命令行参数传递给解析器,解析器返回一个指针,指向包含命令行参数信息的堆分配结构。然后,主模块对命令行中找到的每个文件名调用一次单词计数模块,单词计数模块返回单词计数信息。然后,主模块调用打印模块,该模块使用命令行标志确定要打印哪些信息以及如何对其进行格式化


现在假设您已经设计了模块,并且每个模块都有一个或多个.c文件。您可能仍然需要一些全局状态。在这种情况下,每个模块的.c文件都应该声明所有全局变量,除非模块有多个.c文件,否则整个项目中不应该有其他文件使用该变量,包括外部变量或其他方式。

建议避免使用全局变量;-)你应该:给我们看你的.h文件中的代码,给我们看.c文件中的代码,复制/粘贴编译器错误,并在编译器抱怨的行上显示代码。它比你想象的要大,我不想分享它Buahahaha(:P)。不,真的,只是一些建议和准则是完美的。变量。h将是extern int x;变量c为int x=2;然后我想在文件.c中使用x,在该文件中使用#include“variables.h”,得到x是undefined@Nick这是正常的方法,这种方法非常有效。所以你在某个地方做错了什么,但我们看不出是什么。我们甚至看不出您是否有编译器错误或链接器错误。好吧,看来我将所有全局变量放在一个中的方式不是很好(虽然它会“干净”)。那么您有什么建议?@Nick我正在编辑我的答案,并为您的程序提供更详细的建议。但是,在中期,买或借,阅读它,并遵循它的建议。好吧,简单地说,你建议我将每个变量保持在它必须执行其工作的位置,并尽可能少地使用全局变量?