【问题标题】:difference between void(int) & void (*)(int)void(int) 和 void (*)(int) 之间的区别
【发布时间】:2015-12-23 14:13:54
【问题描述】:

我知道void (*)(int) 是函数指针,但void(int) 是什么?

用于std::function 模板。

假设我有一个函数 void fun(int){}decltype(&fun) 给出 void(*)(int)decltype(fun) 给出 void(int)

【问题讨论】:

标签: c++


【解决方案1】:

如果T 是一个类型,那么T* 表示类型“pointer-to-T”。

void(int) 类型是一个函数类型,它是一个函数的类型,它接受一个int 并返回void。例如,如果f 声明为void f(int);,则为f 的类型

如果T = void(int),那么T*拼写为void(*)(int),所以后者是函数指针的类型。还可以形成对函数的引用,即T& = void(&)(int);这有时更有用(例如,您可以获取函数左值的地址)。


旁注:函数左值衰减到它们的函数指针很容易。您可以通过函数左值或函数指针调用函数。当用作间接运算符 (*) 的操作数时,函数值会衰减,因此您可以一次又一次地取消引用指针:

printf("Hello world\n");        // OK
(*printf)("Hello world\n");     // also OK
(****printf)("Hello world\n");  // four-star programmer

函数不会衰减的唯一情况是用作地址运算符的操作数,或者绑定到引用时:

void f(int);          // our example function

void(*p1)(int) = &f;  // no decay of "f" here
void(*p2)(int) = f;   // "f" decays
void(&r1)(int) = f;   // no decay of "f" here

void g(void(&callback)(int), int n) {
  callback(n);
}
g(f, 10);             // no decay of "f" here

template <typename F, typename ...Args>
decltype(auto) h(F&& callback, Args&&... args) {
    return std::forward<F>(callback)(std::forward<Args>(args)...);
}
h(f, 10);             // no decay of "f" here

【讨论】:

  • 注意:在(几乎?)所有场景中,除了 C++ 模板替换和“直接调用函数”a function type degrades to a function pointer when used 的小例子,所以没有区别。而且我怀疑在模板情况下,函数是模板定义的一部分,如果可以的话,编译器会内联并撤消函数指针(如果它实际上没有使用存储非 constexpr 函数指针的变量)。
  • 我可以有一个 void(int) 类型的 var,如何给它赋值?
  • @Derek:不,不能有函数类型的变量,不能有函数类型的纯右值,函数的返回值不能是函数类型。
  • @Derek:你不能拥有void(int) 类型的变量,但你可以拥有该类型的函数
【解决方案2】:
void (*whatever)(int) 

应该被理解为:无论是指针,指向一个函数,它接受一个 int 作为参数,并且不返回任何内容(即 void)。

void whatever(int)

应该被理解为:任何函数(不是指针),接受一个 int 作为参数,并且不返回任何内容(即 void)

一旦指向函数的指针被初始化为指向一个有效的函数(一个满足原型的函数),那么您就可以通过它的“真实”名称或通过指针来调用该函数。

指向函数的指针非常有用 - 它们是变量,就像其他任何东西一样,因此您可以将它们传递给其他函数(参见例如 qsort()),您可以将它们放在结构中等等。

鉴于此,以下代码有效:

#include <stdio.h>

void myfun(int x) {
  printf("The value of X is %d\n", x);
}

int main() {
    void (*myfunp)(int);

    myfunp = &myfun;

    myfun(13);
    myfunp(12);

    return 0;
}

【讨论】:

    【解决方案3】:

    void(*)(int) 应该被解读为指向 function 的指针类型,它接受一个 int 作为参数,并且不返回任何内容。

    如需了解更多关于指针函数及其用法,请查看:http://www.cprogramming.com/tutorial/function-pointers.html

    【讨论】:

      猜你喜欢
      • 2012-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-01
      • 2018-03-16
      相关资源
      最近更新 更多