【问题标题】:Alternative to nested functions in C?替代 C 中的嵌套函数?
【发布时间】:2015-01-24 05:44:20
【问题描述】:

C 中嵌套函数的标准替代方法是什么?如何为一个函数赋予另一个函数的范围?我真的不想传递额外的参数,比如结构,使用可变长度输入,或者使用 gcc 扩展,除非没有其他方法。

针对我的具体问题,我有这个功能:

double findroot(double (*fp)(double), double start, double end);

它找到一个函数的根,f(x),一个以函数指针作为参数的变量。

我想传入一个包含多个变量的函数,其中除了一个变量外,其他变量都是固定的。例如,f(x,a,b,c),其中 a、b 和 c 都是传入的常量,而 x 是唯一改变的变量。如何在保持 findroot 函数相同的同时找到 f(0,a,b,c) 以使 findroot 函数可重用且通用且不特定于这种情况?

谢谢。

【问题讨论】:

  • 因此,您的问题归结为:如果事先排除了所有可能性(过度使用全局变量,这本身就是一种邪恶),那么还有什么选择。我说对了吗?
  • 我不同意你的设计。在我用 C 编写的所有接受回调的函数中,我总是也接受 void* 指针,并使回调接受该指针作为其第一个参数。这通过允许函数可重入来促进良好的软件工程原则;特别是,这避免了使用通过全局读取的带外数据。例如:typedef double (*SINGLEVARFN)(void* ctx, double x); double findRoot(SINGLEVARFN fn, void* ctx, double start, double end);
  • @user1801359 (应该)标准解决方案是始终允许回调接受“私有”指针,将回调和私有指针都传递给使用回调的函数,并使用提供的私有指针调用回调。你熟悉pthread_create()吗?这是如何正确完成此操作的模型示例。
  • 我不确定(未明确说明的)问题如何建议使用嵌套函数作为解决方案。
  • cmets 建议使用接受单个 void 指针作为其唯一参数的回调仍然有缺点。它们要求您以非常特定的方式构建函数或使用嵌套函数。我认为如果可以轻松使用单个参数,这将不是问题。但是,应该接受权衡取舍。这些解决方案很优雅。

标签: c nested-function


【解决方案1】:

如果您需要找到 f(x,a,b,c) 其中 a、b 和 c 是不变的,那么这建议使用一个新的更专业的函数 f2(x) = f(x,a,b,c) .例如:

double f2( double x )
{    
    return f( x, 1.0, 2.0, 3.0 ) ;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-25
    • 2011-02-06
    • 2021-11-01
    • 1970-01-01
    • 2018-09-02
    • 1970-01-01
    相关资源
    最近更新 更多