你应该在哪里把“typedef enum”放在你的来源?

时间:2012-11-08 21:42:35

标签: c header-files code-organization

我正在开展一个比以前更大的项目,我正在尽最大努力保持我的代码结构合理。我正在编程一个微控制器并有一些全局变量,根据我在这里阅读的一些建议都是在“global_variables.h”文件中定义的,该文件包含在使用全局变量的任何地方。

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

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

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

4 个答案:

答案 0 :(得分:4)

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

首先,使用标题保护,以便多重包含不会导致问题。

在module.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

答案 1 :(得分:4)

我认为拥有头文件global_variables.h并不合理。

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

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

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

 struct {
    int width;
    int height;
 } screen;

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

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

实际上,全球化程度越低,跟踪谁使用它们的理智就越多。