C “你应该把它放在哪里?”;typedef enum";你的消息来源是什么?

C “你应该把它放在哪里?”;typedef enum";你的消息来源是什么?,c,header-files,code-organization,C,Header Files,Code Organization,我正在做一个比以前更大的项目,我正在尽我最大的努力保持我的代码结构正确。我正在编程一个微控制器,并且有一些全局变量,根据我在这里读到的一些建议,这些变量都定义在“global_variables.h”文件中,该文件包含在使用全局变量的任何地方 我还将全局变量的typedef放入“global_variables.h”文件中 我遇到的问题是,我使用全局变量的file1.c有一个function1(new_type_t variable),它接受新的typedef作为参数。问题是我在头文件(file

我正在做一个比以前更大的项目,我正在尽我最大的努力保持我的代码结构正确。我正在编程一个微控制器,并且有一些全局变量,根据我在这里读到的一些建议,这些变量都定义在“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\u variables.h”和“global\u variables\u types.h”,并将.h文件包含在其他文件的头文件中,将.c文件包含在源文件中?

头文件有两个重要的规则,可以使事情顺利进行\

首先,使用标题保护,这样多个包含不会导致问题

在模块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

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

我认为使用头文件
global\u variables.h
是不明智的

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

如果您打算生成可重用代码,请为项目的各个子系统生成单独的标题。但是我觉得没有必要为所有全局变量设置一个标题

最重要的是,使全局变量集保持最小。您应该能够用一只手的手指计算全局变量。如果需要超过4个或5个全局变量,请考虑在全局<代码>结构> <代码>中包装相关的全局变量。例如,如果屏幕大小在全局数据中,则不要声明
int screen\u width、screen\u height但是

 struct {
    int width;
    int height;
 } screen;
当然,真实情况取决于项目,也许还取决于构建链。一些专有编译器不会真正优化,如果使用全局结构,可能会产生错误的代码。如果您使用最新的GCC(作为交叉编译器,最好是在Linux上),您就不会有这个问题,因为GCC优化得很好。始终在编译器上启用所有警告(例如,使用
gcc-Wall-g-O2构建)


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

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

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


事实上,全局变量越少,跟踪谁使用它们就越明智。

你只需要
#在file1.h中包含“global_variables.h”
?总大小为1KLOC(千行源代码),10KLOC,100KLOC???少于20个文件。按正常标准来说很小,但比我习惯使用的3-4个文件大。但是有多少源代码行??有些人有相当大的文件(例如单个
*.c
文件中的20KLOC),其他人则将代码划分为许多少于100行的文件。在Linux上,您可以使用
wc-l*[ch]
sloccount
来度量项目源代码的大小。