【问题标题】:Can someone explain the parameter void(*pfn)(void*)?有人可以解释参数 void(*pfn)(void*) 吗?
【发布时间】:2011-06-01 21:56:01
【问题描述】:

我遇到过这段代码

inline pthread_t CreateThread(void(*pfn)(void*), void* parg, bool fWantHandle=false)

这部分没看懂

void(*pfn)(void*)

谁能告诉我这是什么意思/是什么?

顺便说一句,初学者书籍中没有列出,所以如果你想提及阅读书籍,它不存在。

Afaik,void 是函数的数据类型,这意味着它不会返回任何内容,但是那里的那部分...void 用于指针?

【问题讨论】:

  • 这应该列在任何体面的书中。但是,如果您还不知道它是什么,就没有简单的方法可以找到它。
  • C 和 C++ 中的函数指针语法真的很讨厌,如果你问我的话。
  • 好问题 - 这就是 SO 的全部意义

标签: c++ pointers function-pointers


【解决方案1】:

它是一个函数指针,指向返回void并接受void *的函数。

void example(void *arg);

您可以在The Function Pointer Tutorials 找到有关 C++(和 C)中函数指针的更多信息。

【讨论】:

    【解决方案2】:

    这是一个函数指针(或指向函数的指针)。

    void(*pfn)(void*)
    

    这样分解:

    *pfn(指针的名称,即指向函数的指针)

    (void *)(这些是函数的参数,即指向任何东西的简单指针)

    void(这是函数返回)

    所以如果你有这样的功能:

    void DoSomeThing(void *data) {
      ... does something....
    }
    

    然后你可以像这样将它传递给CreateThread函数......

    int i  = 99;
    void * arg = (void*)&i;
    pthread_t thread = CreateThread(DoSomeThing, arg, ... other parameters ...);
    

    所以在CreateThread的某个地方它会打电话:

    pfn(parg);
    

    您的函数 DoSomeThing 将被调用,您获得的 void * data 将是您传入的参数。

    更多信息:

    请记住,代码只是内存中的一个字节序列。正是 cpu 对它们的解释方式使它们与我们所说的数据不同。

    所以在程序中的任何时候,我们都可以通过内存地址来引用代码的另一部分。由于代码在 C 中被分解为函数,因此这是 C 理解的一个有用的重用单元,并允许我们将函数的地址视为指向某些数据的另一个指针。

    在上面的示例中,CreateThread 函数需要一个函数的地址,以便它可以在新线程中执行该函数。所以我们将一个指向该函数的指针传递给它。因此我们传递一个函数指针

    【讨论】:

      【解决方案3】:

      这些东西最容易从里到外阅读:

      • (*pfn) => "pfn 是一个指针"
      • void x(void*) => "x 是一个接受 void * 参数并返回 void 的函数"

      把它们放在一起,你就有了:

      • "pfn 是一个指向函数的指针,该函数接受void * 参数并返回void"

      请注意,由于优先级,(*pfn) 周围的括号是必需的。 void *pfn(void*) 将被解释为好像写成 (void *)pfn(void *):“pfn 是一个接受 void * 并返回 void * 的函数。

      【讨论】:

      • “注”是体贴的。
      【解决方案4】:

      这称为function pointer
      它指向一个函数而不是一个变量。

      如果它不在你的书中,你应该买一本更好的书。

      【讨论】:

        【解决方案5】:

        这是一个 function pointer 不返回任何内容并采用 void pointer(请参阅名为 void 指针 的部分)。

        【讨论】:

          【解决方案6】:

          CreateThread 的声明表明第一个参数pfn 是一个指向CreateThread 将使用的回调函数的指针。回调pfn 是您自己的函数,CreateThread 将调用它,以便您可以在新线程中执行代码。

          你定义一个函数

          void MyThreadCallback(void* data)
          {
              MyData myData = reinterpret_cast<MyData*>(data);
              ...
          }
          

          并将其传递给CreateThread

          MyData* myData = new MyData();
          CreateThread(MyThreadCallback, myData, ... );
          

          以便CreateThread 可以在新线程的上下文中调用它。

          【讨论】:

            【解决方案7】:

            pfn是一个函数指针,返回类型为void,参数类型为void*

            【讨论】:

              【解决方案8】:

              它是一个函数指针。 pfn 这个名字是一个线索。具体来说,它是一个指向函数的指针,该函数接受一个“void 指针”并且不返回任何内容。 “空指针”是一种假类型,可以转换为其他类型的指针。

              大多数 C++ 书籍都详细介绍了 void 指针和函数指针。可能比必要的更详细,因为您可以编写非常好的 C++ 代码,而无需使用任何一个。如果您的书在某种程度上都是超现代的并且没有涵盖它们,请查找 C 参考。

              【讨论】:

                猜你喜欢
                • 2013-09-12
                • 2021-09-18
                • 1970-01-01
                • 2011-02-09
                • 1970-01-01
                • 2016-12-17
                • 2013-09-20
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多