c - 您应该将 "typedef enum"放在源代码的什么位置?

标签 c header-files code-organization

我正在从事一个比以往更大的项目,并且我正在尽最大努力保持我的代码结构正确。我正在对微 Controller 进行编程并且有一些全局变量,根据我在此处阅读的一些建议,这些变量都定义在“global_variables.h”文件中,该文件包含在使用全局变量的任何地方。

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

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

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

最佳答案

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

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

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

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

 struct {
    int width;
    int height;
 } screen;

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

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

关于c - 您应该将 "typedef enum"放在源代码的什么位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13298329/

相关文章:

不能使用头文件中定义的函数

c++ - 为内存和外部依赖管理重新组织 C++ 代码

python - 如何组织Python API模块使其整洁?

c - 解析输入并添加到结构数组

c - C 中的 Strlen 指针

c - PCRE 的 PCRE_PARTIAL 的 Perl 等价物是什么?

c - 打印结构数组

iphone - Objective C 中的头文件/主文件

c++ - 使用来自另一个项目(目录)的头文件

ruby - 组织 Ruby 测试文件夹结构的最佳实践是什么?