gpt4 book ai didi

c - 如何在代码 .h 文件中组织声明和函数并包含以实现最佳代码重用

转载 作者:行者123 更新时间:2023-12-01 12:44:48 26 4
gpt4 key购买 nike

希望有人能提供帮助 - 对于这个非常基本的问题,我深表歉意,但我正在使用标准 C 为 PIC 微 Controller 的一些实验编写代码,而且我对 C 语言还很陌生。

我有各种逻辑代码组,例如控制 LCD 显示器的函数,我想将它们重新用于基于 PIC 的项目,并且想知道如何最好地分解这些逻辑代码组复用性。

在 LCD 函数的示例中,我假设我将声明拆分为一个名为“lcd.h”的头文件(包括在我的 IDE 的“头文件”项目目录中)和一个包含“lcd.c”的函数定义'(包括在我的 IDE 的“源文件”项目目录中)- 这是否正确?

以这种方式分解代码的命名约定是什么?例如,所有全局声明都应该在名为“main.h”的头文件中吗?

非常感谢,亚历克斯

最佳答案

您专注于模块化是件好事。它不仅会为您带来可重用性,还会使调试更容易。

命名约定

你是对的。对于 LCD 函数,创建文件 lcd.clcd.h。没有通用的函数命名约定,但这是我使用的:

lcd.h:

void LCD_PublicFunction(void);

lcd.c:

static void PrivateFunction(void);

void LCD_PublicFunction(void)
{
// Function goes here
}

static void PrivateFunction(void)
{
// Function goes here
}

我在所有公共(public)函数前面放置了一个 LCD_ 前缀,以防止命名空间冲突,并帮助我随时找到函数的位置。 static 键盘阻止 lcd.c 之外的任何函数看到 PrivateFunction 并且我删除了前缀以表示私有(private)。

全局变量

请避免使用全局变量。随着项目的增长,跟踪逻辑将变得更加困难。相反,请使用 getter 和 setter 函数。

static int brightness;

void LCD_SetBrightness(int var)
{
brightness = var;
}

int LCD_GetBrightness(void)
{
return brightness;
}

这为您提供了更大的灵 active 。每次设置亮度时,您可能需要添加一些逻辑。也许您希望该变量是只读的,因此您可以删除 setter。

粒度

尽量分解你的项目。我假设您将使用某种串行端口与 LCD 通信。从LCD显示固件中分离通信固件。

例如,如果它使用 SPI,那么您应该创建一个 spi.c 和一个 spi.h

我已经看到这种做法走得太远了。我见过人们将所有 I/O 端口的功能包装起来,这样他们就可以将数字引脚设置为高电平和低电平。

坏例子:

void IO_PortA7 (char val)
{
LATAbits.LATA7 = val;
}

除了添加一些语法糖之外,我在这里并没有真正获得任何东西。只需在代码中使用 LATAbits.LATA7,因为它是在 PIC 上打开和关闭 I/O 的标准方法。

很好的例子:

void FX_SetBuzzer (char is_active)
{
LATAbits.LATA7 = is_active;
}

只要阅读代码,您就会知道我已经将蜂鸣器连接到引脚 A7。此外,其余代码不关心我如何连接蜂鸣器,如果我必须将蜂鸣器移动到不同的引脚,我只需要做一个改变。最后,通过使用变量名 is_active,我记录了蜂鸣器处于高电平有效的事实。我尝试对所有 bool 变量使用问题来记住真实条件下发生的事情。

测试

最后一条建议。在每个 .c 文件中,创建一个测试工具。

#ifdef LCD_TEST

int main(void)
{
// Enable LCD communication.
LCD_Init();

// Display friendly greeting.
LCD_Display("Hello, world!");

// Wait for power-down.
for(;;);
}

#endif

这样,您就可以构建一个小程序来自行测试 LCD。它有多种用途。

  • 接着是Test-driven_development ,这是一件好事。
  • 它通过展示一个功能示例提供了一种基本形式的文档。
  • 将来,您的 LCD 可能会突然停止工作。只需调用这段代码,看看会发生什么。如果测试成功,您就知道您的最新更改以某种方式破坏了 LCD 功能。如果没有,您就知道问题出在 LCD 本身或其与 PIC 之间的连接上。

祝你好运!

关于c - 如何在代码 .h 文件中组织声明和函数并包含以实现最佳代码重用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21215172/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com