我有一个通过轮询调用的函数(每10毫秒)并检查它的开始:
if(input != saved_data)
return;
// rest of the function...
虽然这项检查可以节省大量时间,但有时也是错误的,而且我目前正在调试我需要继续执行该功能的情况,尽管input == saved_data
。
我想到了两个选项:
old_function_force
,if 我选择了选项2,因为我不想修改该函数的所有其他调用,我希望代码向后兼容,但我想到我的解决方案也很糟糕,因为当有人应该改变old_function
他可能会忘记改变我的,这会导致新的错误
除了这两个之外还有更好的解决方案,还是改善其中一个的方法?
答案 0 :(得分:5)
两者的混合实际上是如何避免代码重复和更改每个可能的呼叫站点:
重命名您的函数并添加flag参数。
void func_with_force(/*parameters*/, bool force)
{
if(!force && input != saved_data)
return;
// Other code
}
在旧名称下添加一个新功能,该功能使用等于false
的标志调用上面的功能。
void func(/*parameters*/)
{
func_with_force(/*Argument forwarding*/, false);
}
是的,我假设stdbool.h
。
您还可以更进一步,将func
完全放在标题中;只需添加内联说明符:
inline void func(/*parameters*/)
{
func_with_force(/*Argument forwarding*/, false);
}
引用C11标准(6.7.4p7):
对于具有外部链接的函数,以下限制适用:如果使用内联函数说明符声明函数,则它也应在同一个转换单元中定义。如果转换单元中函数的所有文件范围声明都包含不带extern的内联函数说明符,则该转换单元中的定义是内联定义。内联定义不提供函数的外部定义,也不禁止在另一个翻译单元中使用外部定义。
以上意味着即使许多翻译单元包含标题,内联定义也不会相互干扰。如此短暂,存根很可能只是被优化为直接调用你的新功能。