Имя функции, используемой как указатель - PullRequest
0 голосов
/ 19 июня 2020

У меня есть функция:

void *task();

, и имя task используется в качестве аргумента в другой функции:

pthread_create(..., task, ...);

Это особый случай или это всегда правда, факт что имя функции содержит ее адрес?

Приведенный выше аргумент pthread_create должен быть указателем:

void *(*start_routine)(void*)

EDIT:

void *task()
{
    printf("I am a simple thread.\n");
}

Спасибо за ваше время.

1 Ответ

4 голосов
/ 19 июня 2020

Особого случая нет - наоборот! Имя функции почти всегда превращается в указатель на функцию. Единственное исключение - когда это операнд &, т.е. &task, он не распадается на указатель функции, но & все равно преобразует указатель функции в указатель, таким образом если task обозначает функцию (т.е. это не указатель), оба pthread_create(..., task, ...); и pthread_create(..., &task, ...); будут работать одинаково.


Фактически, оператор вызова функции может применяться только в указатели функций:

printf("Hello world");

принимает обозначение функции printf , а преобразует его в указатель на функцию, а затем вызывает функцию, на которую указывает этот указатель, давая это аргумент "Hello world".


Также обратите внимание, что void *task(); - несколько неверное объявление для функции pthread, оно должно быть void *task(void *);.

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