2012-05-14 51 views
0

我创建了一个名为variables.h来存储所有的变量在program.Then要使用的头文件我裁剪的程序到单独的原型.h文件和.C文件。变量,并共享许多.c文件

我决定创建一个variables.c文件来定义变量。在variables.h中它们有extern关键字,并且在c文件中它们被定义了。但是当我在其他c文件中包含“variables.h” ,我得到这样的“失踪二元运算符”的错误,“VAR_1未定义”等

建议?

+3

一个建议是避免全局变量;-) –

+0

你应该:我们在您的.h文件中的代码,显示.c文件,复制/粘贴编译器错误代码,并显示在行代码编译器会抱怨。 – nos

+0

其比你想象的大,我不想分享它buahaha(:P)。没有真正的,只是一些建议和指导是完美的。 – Rrjrjtlokrthjji

回答

1

我有一个建议:利用范围。

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


编辑:建议避免全局变量

鸿沟代码到模块,每个模块有一个工作要做,然后执行该任务,而不依赖于模块的外部可见的任何全局变量。请注意,根本不取决于任何全局变量也符合此标准,并且确实是首选。另外,我喜欢StackOverflow回答here中给出的建议。

让我们看看将一个程序分成模块的一个简单的例子。通常,用户可见程序将具有一些用户界面逻辑,一些业务逻辑以及可能的数据库连接覆盖。这些东西中的每一个都代表至少一个模块,可能有几个。作为我们的例子,让我们离开数据库,并考虑一个类似Unix的程序wc。它读取一个文件,计算单词,并打印单词的数量。很简单,对吧?那么,即使这个简单的程序应该有一个模块来解析命令行参数并将这些参数放入一个结构中,一个模块用于实际计算单词,另一个模块用于打印单词计数。用户界面模块(在这种情况下,包含main函数的一个文件)将命令行参数传递给解析器,该解析器返回一个指向包含有关命令行参数信息的堆分配结构的指针。然后,主模块为命令行上的每个文件名调用一次字计数模块,字计数模块返回字数信息。然后,主模块调用打印模块,该模块使用命令行标志来确定要打印的信息以及如何对其进行格式化。

现在,让我们说,你设计你的模块,你必须每个模块一个或多个.c文件。您可能还需要一些全球状态。在这种情况下,每个模块的.c文件应该声明所有全局变量,除非模块具有多个.c文件,否则整个项目中不应该有其他文件使用该变量,可以通过包含extern或以其他方式。

+0

好吧,看起来像我把所有全局变量一个并不好(认为它会“干净”),那么你有什么建议? – Rrjrjtlokrthjji

+0

@Nick我正在编辑我的答案,提供更详细的程序建议。但从中期来看,购买或借用[Code Complete](http://www.amazon.com/Code-Complete-Practical-Handbook-Construction/dp/0735619670),阅读并遵循其建议。 –

+0

好的,所以用简单的话来说,你建议我把每个变量都保存在它必须执行工作的地方,并尽可能少地使用全局变量? – Rrjrjtlokrthjji