【问题标题】:How does C call functions without parameters?C如何调用没有参数的函数?
【发布时间】:2014-05-19 18:55:22
【问题描述】:

我正在通过building my own Lisp 学习 C,但我无法弄清楚下一行代码的工作原理:

lenv_add_builtin(e, "def", builtin_def);

我不明白的是:第三个参数怎么调用一个没有参数的函数(lenv*, lval*)。我的猜测是它们是作为typedef structs 构建的,但我不确定。 这是完整的代码

// function pointer
typedef lval*(*lbuiltin)(lenv*, lval*);

lval* builtin_def(lenv* e, lval* a){
    return lval_sexpr(); 
}

void lenv_add_builtins(lenv* e){
    lenv_add_builtin(e, "def", builtin_def); // ???
}

int main(int argc, char** argv){
    lenv* e = lenv_new(); // constructor
    lenv_add_builtins(e)
    return 0;
}

【问题讨论】:

  • 函数指针:函数没有被调用,只是被传递了。
  • 第三个参数不是函数调用;它是一个函数指针。指向的函数稍后会被调用。
  • lenv_add_builtin 将创建正确的两个参数。当lenv_add_builtin 被调用并被传递给builtin_def 时,它只是函数的一个内存位置,像这样传递它并不意味着它会被立即调用。

标签: c function function-pointers


【解决方案1】:

这一行

lenv_add_builtin(e, "def", builtin_def);

不调用builtin_def。在对lenv_add_builtin 的调用中用作指针(指向函数)。

【讨论】:

  • 好的,我明白了,所以任何没有参数的函数都用作指针(指向函数)?或者我应该像这样lenv* (*builtin_def)(int, int) 声明它以使其成为可能。或者正如@Jens 在下面的答案中所说,没有 () 后跟的函数标识符评估为函数指针
  • @Pompeyo,是的。您仍然必须声明它。否则,编译器将不知道变量的类型。 Jens 说的是真的。
【解决方案2】:

C 语言规定,函数调用运算符 () 后面没有跟随的函数标识符计算为函数的地址(又名 函数指针)。

函数指针的典型用途是用作回调。标准示例是qsort 函数的最后一个参数,即任意比较函数的地址。

void qsort(void *base, size_t nmemb, size_t size,
     int (*compar)(const void *, const void *));

【讨论】:

    【解决方案3】:

    它不是调用函数;它传递了一个函数(从技术上讲,是一个函数指针),该函数可用于调用该函数,此时将提供所需的参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多