【问题标题】:Pass a function with arguments as argument传递带有参数的函数作为参数
【发布时间】:2014-03-21 19:53:49
【问题描述】:

我想将带有参数的函数作为参数传递给其他函数,但我不知道如何(或是否)可以这样做。

我想做的是:

#include <stdio.h>

void getInput(char* request, int (*func)());

int main()
{
    double input;
    getInput("Input: ", scanf("%lf", &input));
}

void getInput(char* request, int (*func)())
{
    // do stuff
    func()
    // do more stuff
}

不幸的是,这不起作用。我认为当我尝试将 scanf 作为参数传递时,它会被执行。 如何让它在 getInput 中运行?

【问题讨论】:

  • 请注意,虽然 C 可能不支持它,但像 libffi 这样的库可以做到这一点,而且也是跨平台的。

标签: c function-pointers


【解决方案1】:

你不能在 C 中做到这一点,该语言不支持这样的结构。

您通常可以再次使用可变参数函数来解决这种确切类型的问题:

void getInput(const char *request, const char *fmt, ...)
{
  va_list args;
  printf("%s: ", request);
  fflush(stdout);
  va_start(fmt, args);
  vscanf(fmt, args);
  va_end(args);
}

用法是这样的:

int main(void)
{
  double input;
  getInput("Input", "%lf", &input);
  return 0;
}

当然,您可能希望添加适当的返回值处理,否则无法知道嵌入的 vscanf() 是否成功,因此该变量可以使用。

【讨论】:

  • 我们是否可以通过将'\n' 附加到printf 的格式字符串来替换fflush 调用?
  • @ajay 当然,但这会将提示单独放在一行上,看起来不太好看。冲洗stdout 很好,这基本上是那里的核心用例。 :)
猜你喜欢
  • 2010-11-20
  • 2011-09-15
  • 2019-11-21
  • 1970-01-01
  • 2021-10-08
  • 1970-01-01
  • 2020-09-27
相关资源
最近更新 更多