Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何以最佳方式复制函数_C - Fatal编程技术网

C 如何以最佳方式复制函数

C 如何以最佳方式复制函数,c,C,我有一个函数,通过每10毫秒轮询一次来调用,并检查它的开始: if(input != saved_data) return; // rest of the function... 虽然这个检查节省了很多时间,但有时它是错误的,我目前正在调试一种情况,在这种情况下,我需要继续执行函数,尽管输入==保存的数据 我想到了两个选择: 在参数列表中添加一个force标志,当它为true时,if将被忽略 使用相同的代码创建一个新函数old_function_force,if除外 我选择了选项2,因

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

if(input != saved_data)
    return;
// rest of the function...
虽然这个检查节省了很多时间,但有时它是错误的,我目前正在调试一种情况,在这种情况下,我需要继续执行函数,尽管输入==保存的数据

我想到了两个选择:

在参数列表中添加一个force标志,当它为true时,if将被忽略 使用相同的代码创建一个新函数old_function_force,if除外 我选择了选项2,因为我不想修改对函数的所有其他调用,我希望代码向后兼容,但我觉得我的解决方案也很糟糕,因为当有人应该更改旧的函数时,他可能会忘记更改我的函数,这会导致新的bug


除了这两个,还有更好的解决方案吗?或者有改进其中一个的方法吗

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

重命名函数并添加flag参数

void func_with_force(/*parameters*/, bool force)
{
  if(!force && input != saved_data)
    return;

  // Other code
}
在旧名称下添加一个新函数,该函数使用等于false的标志调用上面的函数

是的,我假设是stdbool.h

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

inline void func(/*parameters*/)
{
  func_with_force(/*Argument forwarding*/, false);
}
引用C11标准6.7.4p7:

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


上面的意思是,即使许多翻译单元包含标题,内联定义也不会相互干扰。由于短,存根很可能被优化为直接调用新函数。

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

重命名函数并添加flag参数

void func_with_force(/*parameters*/, bool force)
{
  if(!force && input != saved_data)
    return;

  // Other code
}
在旧名称下添加一个新函数,该函数使用等于false的标志调用上面的函数

是的,我假设是stdbool.h

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

inline void func(/*parameters*/)
{
  func_with_force(/*Argument forwarding*/, false);
}
引用C11标准6.7.4p7:

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


上面的意思是,即使许多翻译单元包含标题,内联定义也不会相互干扰。由于非常短,存根很可能被优化为直接调用新函数。

我假设当我需要强制执行时。我将使用_force/*参数*/调用func_,真的,是吗?@noob-准确地说。我主要关注如何以尽可能低的成本添加新功能。当然,如果你想使用新的功能,你需要调用新命名的函数。我将使用_force/*参数*/调用func_,真的,是吗?@noob-准确地说。我主要关注如何以尽可能低的成本添加新功能。当然,如果要使用新功能,需要调用新命名的函数。