【问题标题】:C, function pointer with arguments presetC、预设参数的函数指针
【发布时间】:2014-11-26 02:51:21
【问题描述】:

在 C 语言中这样的事情是可能的吗?

#include <stdio.h>

void print_str(char *str) {
        printf(str);
}

int main() {

        void (*f_ptr)() = print_str,"hello world";

        f_ptr();

}

//see "hello world" on stdout

简而言之,我想要一个“存储”参数的函数指针。关键是函数指针可以在以后使用,而不需要引用原始数据。

我可以使用这样的东西来耦合函数指针和参数引用

struct f_ptr {
 void (*f)();
 void *data;
}

void exec_f_ptr(f_ptr *data) {
  data->f(data->data):
}

但不会像调用带有参数的函数指针那样优雅。

【问题讨论】:

  • printf(str) 请求格式字符串攻击!
  • 您使用了错误的语言。第二种解决方案一般是C中使用的。我们不能只取不同签名的函数指针,并尝试通过相同的代码全部调用它们。 C++ 有更多的功能,更适合这种情况,但具有动态类型和函数作为一流对象的脚本语言通常最适合这种代码。
  • 你可以定义一个宏#define DO_FUN( d ) (d)-&gt;f((d)-&gt;data),然后用参数调用一个指针,你把你的一行变成DO_FUN(data);
  • 哦,这就是你正在用 exec 函数做的事情,我现在明白了吗?在那种情况下,每个人都是对的,这几乎是你所拥有的最好的。

标签: c function-pointers


【解决方案1】:

您想要的是closurecurried function。不幸的是,C 没有这些。 (Apple 在其 C 版本中使用了introduce closures,希望它们会被该语言的某些未来版本采用,但它不是 C99 的一部分。)

【讨论】:

  • 柯里化函数是闭包吗?
【解决方案2】:

您基本上是在要求一个闭包而不是一个函数指针——即一个“对象”中的数据和代码。此类对象在标准 C 中不存在——您可以从 Apple 的块或其他语言中的匿名函数(或直接从支持它们的语言中的闭包)获得类似的东西,但一般来说,您必须构造一些数据类型你自己的,正如你所发现的那样。

【讨论】:

  • 对于这种结构的大型实现,函数指针和参数,我相信 DIKU 和 ROM MUD 都有这种风格的结构传递给很多函数。
【解决方案3】:

GLib 有support for closures,主要用于信号回调。它是跨平台的,可能值得一看(取决于您的要求)。 (另见GLib closure API。)

【讨论】:

  • 虽然很有趣,但这可能不是很有用,因为您希望在 C 中使用闭包的通常地方是与传统 API 一起使用,这些 API 忽略了自己传递上下文的能力 - 例如,如果您想使用qsort(),但比较取决于一个参数,并且有足够多的可能参数,您无法为每个参数创建不同的函数。
【解决方案4】:

不,该结构是您将获得的最接近的东西

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-07
    • 1970-01-01
    • 1970-01-01
    • 2018-01-03
    • 2015-04-18
    • 2017-11-28
    • 1970-01-01
    相关资源
    最近更新 更多