Может кто-нибудь объяснить параметр void (* pfn) (void *)? - PullRequest
4 голосов
/ 02 июня 2011

Я наткнулся на этот кусок кода

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

Я не понимаю эту часть

void(*pfn)(void*)

Может кто-нибудь сказать мне, что это значит / *? 1007 *

Кстати, этого нет в книгах для начинающих, поэтому, если вы хотите упомянуть, что читаете книги, его там нет.

Afaik, void - это тип данных функции, означающий, что она ничего не будет возвращать, однако эта часть ... void используется для указателя?

Ответы [ 8 ]

9 голосов
/ 02 июня 2011

Указатель на функцию, возвращающую void и принимающую void *.

void example(void *arg);

Дополнительную информацию об указателях функций в C ++ (и в C) можно найти по адресу Учебники по указателям на функции .

6 голосов
/ 02 июня 2011

Это указатель на функцию (или указатель на функцию).

void(*pfn)(void*)

Этот код разбивается следующим образом:

*pfn (имя указателя, т.е. указатель на функцию)

(void *) (это параметры функции, т. е. простой указатель на что-либо)

void (это возврат изfunction)

Итак, если у вас есть такая функция:

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 аргумент, который вы передали.

Дополнительная информация:

Помните, что код - это просто последовательность байтов в памяти.Именно то, как процессор их интерпретирует, отличает их от того, что мы называем данными.

Таким образом, в любой точке программы мы можем ссылаться на другую часть кода по ее адресу в памяти.Так как код разбит на функции в C, это полезная единица повторного использования, которую C понимает и позволяет нам рассматривать адрес функции как просто еще один указатель на некоторые данные.

В приведенном выше примере функции CreateThread требуется адрес функции, чтобы она могла выполнять эту функцию в новом потоке.Таким образом, мы передаем ему указатель на эту функцию.Следовательно, мы передаем ему указатель на функцию .

6 голосов
/ 02 июня 2011

Эти вещи проще всего прочитать наизнанку:

  • (*pfn) => "pfn - указатель"
  • void x(void*) => "x - этофункция, принимающая аргумент void * и возвращающая void "

Соедините их вместе, и вы получите:

  • " pfn - указатель на функцию, принимающуюvoid * аргумент и возвращение void "

Обратите внимание, что паренсы вокруг (*pfn) необходимы из-за приоритета.void *pfn(void*) будет интерпретироваться так, как если бы оно было написано (void *)pfn(void *): «pfn - это функция, которая принимает void * и возвращает void *».

5 голосов
/ 02 июня 2011

Это называется указатель на функцию .
Он указывает на функцию, а не на переменную.

Если ее нет в вашей книге, вам лучше купить книгу.

2 голосов
/ 02 июня 2011

Объявление CreateThread говорит, что первый параметр pfn является указателем на функцию обратного вызова, которая будет использоваться CreateThread. Обратный вызов pfn - это ваша собственная функция, которую вызовет CreateThread, чтобы вы могли выполнить свой код в новом потоке.

Вы определяете функцию

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

и передайте его CreateThread как

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

, чтобы CreateThread мог вызывать его в контексте нового потока.

2 голосов
/ 02 июня 2011

Это указатель на функцию , который ничего не возвращает и принимает указатель void (см. Раздел под названием указатели void ).

1 голос
/ 02 июня 2011

Это указатель на функцию.Название PFN является ключом.В частности, это указатель на функцию, которая принимает «пустой указатель» и ничего не возвращает.«Пустой указатель» - это фальшивый тип, который может быть приведен к другому виду указателя.

В большинстве книг по C ++ подробно рассматриваются как пустые, так и функциональные указатели.Вероятно, больше деталей, чем необходимо, поскольку вы можете написать совершенно хороший код C ++, даже не используя его.Если ваши книги как-то суперсовременны и не охватывают их, ищите справочник по Си.

1 голос
/ 02 июня 2011

pfn является указателем на функцию, тип возвращаемого значения void и тип аргумента void *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...