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