0

我正在从事一个比以往更大的项目,并且我正在尽我所能保持我的代码结构正确。我正在编写一个微控制器并且有一些全局变量,根据我在这里阅读的一些建议,这些变量都定义在一个“global_variables.h”文件中,该文件包含在使用全局变量的任何地方。

我还将全局变量的 typedef 放入“global_variables.h”文件中。

我遇到的问题是我使用全局变量的 file1.c 有一个 function1(new_type_t variable),它接受新的 typedef 作为参数。问题是我在头文件(file1.h)中定义了function1原型,但是由于#include“global_variables.h”位于file1.c中,所以file1.h中的函数原型看不到typedef .

我觉得这很常见,但谷歌搜索似乎并没有提供太多帮助。我应该制作一个单独的“global_variables.h”和“global_variables_types.h”并将.h文件包含在我的其他文件的标题中,并将.c包含在源代码中吗?

4

4 回答 4

4

头文件有一些重要的规则可以使事情顺利进行..\

首先,使用标头保护,这样多重包含就不会导致问题。

在模块.h...

  #ifndef MODULE_H
  #define MODULE_H
  ...
  #endif

现在,是否包含相同的标题两次都没关系。

第二条规则(现在您有了标头保护)是每个 .h 文件都应该包含它需要编译的所有其他文件。完成此操作后,您的代码在在另一个模块中重用一个标头以及使标头排序正确方面将更加健壮。

  #ifndef MODULE_H
  #define MODULE_H

  #include "module2.h"  // we need a type from here.

  void myFunc(Module2Type t); 
  #endif
于 2012-11-08T21:51:17.030 回答
4

我不认为有一个头文件global_variables.h是明智的。

如果您的项目是一个小型的单人项目(例如,少于 50KLOC = 50,000 行源代码),并且您不打算制作可重用的库,那么为所有项目使用一个单独的头文件可能是明智的。该头文件将声明全局变量,并在它们之前声明相关类型。您还将声明所有函数,最后定义所有内联函数。您可以考虑将内联函数放在单独的头文件中(包括您的主头文件)。

如果您打算制作可重用的代码,请为项目的单独子系统制作单独的标头。但我觉得不需要为所有全局变量设置一个标题。

最重要的是,保持你的全局变量集最小。您应该能够用一只手的手指计算全局变量。如果您需要超过 4 或 5 个全局变量,请考虑将相关的全局变量打包在一个全局struct. 例如,如果屏幕尺寸在全局数据中,不要声明int screen_width, screen_height;,而是

 struct {
    int width;
    int height;
 } screen;

当然,真正的事情取决于项目,也许取决于构建链。一些专有编译器并没有真正优化,如果使用全局结构,可能会产生错误的代码。如果您使用最近的 GCC(作为交叉编译器,最好在 Linux 上使用),您就不会遇到这个问题,因为 GCC 优化得很好。始终在编译器上启用所有警告(例如 build with gcc -Wall -g -O2

一个好的建议是研究一些与您类似的现有自由软件的源代码。

于 2012-11-08T21:56:35.380 回答
1

一种常见且灵活的方法是在 .h 中使用extern链接声明全局变量。然后在您选择的 .c 文件中定义全局变量。

在需要引用全局变量的任何地方包含该 .h 。链接器将负责解析对相应 .obj 文件的引用。

事实上,全局变量越少,跟踪使用它们的人就越理智。

于 2012-11-08T23:17:01.730 回答
1

一种选择是在 file1.h 中包含 global_variables.h 而不是 file1.c。这是否是一个好的解决方案,取决于您的源代码树。

于 2012-11-08T21:53:58.800 回答