gpt4 book ai didi

c - 用函数替换重复的代码行

转载 作者:太空宇宙 更新时间:2023-11-04 02:49:37 25 4
gpt4 key购买 nike

我从事嵌入式 C 语言的工作,并尝试重构代码以提高可读性并优化项目中使用的 ROM。

我将这 3 行代码在开关盒中重复多次,以更新特定屏幕名称上的特定编辑框。

EbSetText 和 SetState 是预定义的图形库函数。

sprintf(Screen1_Editbox1_Text,"%04d",GetHV(0));
EbSetText((EDITBOX *)GOLFindObject(ID_Screen1_Editbox1), Screen1_Editbox1_Text);
SetState(GOLFindObject(ID_TestProbe_HVEb01), EB_DRAW);

有些代码是这样重复的:

EbSetText((EDITBOX *)GOLFindObject(ID_Screen1_Editbox1), "Text to output");
SetState(GOLFindObject(ID_TestProbe_HVEb01), EB_DRAW);

对于存在的各种文本框和字符串/缓冲区输入,上面的代码片段重复了 120 次。这主要损害了我的代码的可读性,我的 ROM 接近 90%。

我正在考虑将其替换为包含上述所有逻辑的效用函数。

SetTextofEditBox(Screen1_Editbox1_Text,ID_Screen1_Editbox1);

用单个效用函数替换它在这里有什么优势吗?

最佳答案

正如 unwind 所说:函数调用可能比您现在拥有的更昂贵。当然,庞大的函数和重复相同的代码会导致代码丑陋,更难维护,因此更容易出错。

我个人会考虑使用 inline 函数,让编译器决定代码是否应该在本地执行,或者函数调用确实是更好的选择。
或者,如果您愿意,也可以简单地使用宏。

inline 通常被认为是更好的选择,看看您发布的那些小代码片段,我想您可能也应该在这里使用内联函数。
请记住,inline 将其留给编译器来决定该函数是否将被内联,因此如果 - 经过一些严肃且具有代表性的测试 - 你觉得函数 应该 始终内联,并且您使用的是 gcc,您可以使用 GCC always_inline 属性:

__attribute__((always_inline)) void your_inline_func(void *x, const char *y){}

如果不能说服您的编译器始终如此轻松地内联函数,那么您将不得不恢复使用宏。请注意:宏不是类型安全的,并且可能有副作用:必须进行全面测试。

根据您发布的 2 条声明,一种使您的代码更“数据驱动”的方法可能是这样的:

const char *txt_argument;
//and for any other argument you might need, too:
EDITBOX *edit = NULL;
//possibly add SetState's arguments
switch(foo)
{
case bar:
txt_argument = Screen1_Editbox1_Text;
edit = (EDITBOX *)GOLFindObject(ID_Screen1_Editbox1);
break;
case zar:
txt_argument = "Text to output";
edit = (EDITBOX *)GOLFindObject(another_editbox);
break;
}
EbSetText(edit, txt_argument);

这并没有真正减少您拥有的代码量,但确实可以更轻松地监督 switch 实际执行的操作。

如果您正在寻找(进一步)优化这一大型 switch 语句的方法,那么您可以查看 nesting the switch cases .这很可能几乎没有影响,但对于某些编译器,在某些情况下,它可以有所作为。

如果您有 120 个案例,请尝试看看是否可以将它们分成 2 或 3 组:非常常见的那些、可能发生的那些以及很少发生的那些。最常见的情况在主 switch 中,然后 default 包含另一个列出不太常见情况的开关,而那里的默认值又是处理的开关在极少数情况下。
嵌套当然容易产生困惑的代码,如果您愿意,您可以简单地用一系列较短的 switch-es 替换 default: switch 位,然后返回。 ..

关于c - 用函数替换重复的代码行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23539501/

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