我正在开展一个比以前更大的项目,我正在尽最大努力保持我的代码结构合理。我正在编程一个微控制器并有一些全局变量,根据我在这里阅读的一些建议都是在“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文件中吗?
答案 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文件的引用。
实际上,全球化程度越低,跟踪谁使用它们的理智就越多。