如何最佳地复制功能

时间:2017-02-16 07:42:59

标签: c

我有一个通过轮询调用的函数(每10毫秒)并检查它的开始:

if(input != saved_data)
    return;
// rest of the function...

虽然这项检查可以节省大量时间,但有时也是错误的,而且我目前正在调试我需要继续执行该功能的情况,尽管input == saved_data

我想到了两个选项:

  1. 添加" force"标记到参数列表,并且它是真的,if将被忽略
  2. 使用相同的代码创建一个新函数old_function_force,if
  3. 除外

    我选择了选项2,因为我不想修改该函数的所有其他调用,我希望代码向后兼容,但我想到我的解决方案也很糟糕,因为当有人应该改变old_function他可能会忘记改变我的,这会导致新的错误

    除了这两个之外还有更好的解决方案,还是改善其中一个的方法?

1 个答案:

答案 0 :(得分:5)

两者的混合实际上是如何避免代码重复和更改每个可能的呼叫站点:

  1. 重命名您的函数并添加flag参数。

    void func_with_force(/*parameters*/, bool force)
    {
      if(!force && input != saved_data)
        return;
    
      // Other code
    }
    
  2. 名称下添加一个新功能,该功能使用等于false的标志调用上面的功能。

    void func(/*parameters*/)
    {
      func_with_force(/*Argument forwarding*/, false);
    }
    
  3. 是的,我假设stdbool.h

    您还可以更进一步,将func完全放在标题中;只需添加内联说明符:

    inline void func(/*parameters*/)
    {
      func_with_force(/*Argument forwarding*/, false);
    }
    

    引用C11标准(6.7.4p7):

      

    对于具有外部链接的函数,以下限制适用:如果使用内联函数说明符声明函数,则它也应在同一个转换单元中定义。如果转换单元中函数的所有文件范围声明都包含不带extern的内联函数说明符,则该转换单元中的定义是内联定义。内联定义不提供函数的外部定义,也不禁止在另一个翻译单元中使用外部定义。

    以上意味着即使许多翻译单元包含标题,内联定义也不会相互干扰。如此短暂,存根很可能只是被优化为直接调用你的新功能。