Я запутался в значении void *function()
.
Это указатель на функцию или возвращаемую функцию void*
? Я всегда использовал его в структурах данных как рекурсивную функцию, возвращающую указатель, но когда я увидел код в многопоточности ( pthread
), было одно и то же объявление функции. Теперь я запутался в чем разница между ними.
c++
c
pointers
function-pointers
declaration
user9515151
источник
источник
void*function();
синтаксически правильно. Например, для Python они выбрали другое решение - формат является частью синтаксиса. ИМХО, оба способа имеют свои плюсы и минусы.void *function()
это функция, принимающая произвольное количество аргументов и возвращающая значение, которое при разыменовании имеет тип void . В C ++void* function()
это функция, не имеющая аргументов и возвращающая значение указателя на пустоту . Вы должны решить, на каком языке вы спрашиваете.void *
. В конце концов, даже если бы вы могли, что бы вы сделали сvoid
?Ответы:
Функция имеет тип возвращаемого значения
void *
.Поэтому я всегда предпочитаю в таких случаях отделять символ
*
от имени функции, напримерИ, как
Jarod42
указано в комментарии, вы можете переписать объявление функции в C ++, используя завершающий тип возврата, такой какЕсли вы хотите объявить указатель на функцию, вы должны написать
Или
Или указатель на функцию, которая возвращает указатель на функцию
источник
void* function();
. Это не так заманчиво ... ;-) (Редактирование произошло как раз во время написания этой статьи.)void * reader();
затемpthread_create(&thread1,null,reader,reader_arg)
вместоpthread_create(&thread1,null,&reader,reader_arg)
auto function() -> void*
(C ++). :)typedef
... ;-)Всякий раз, когда я не уверен в проблемах с синтаксисом языка Си, мне нравится использовать утилиту cdecl ( онлайн-версия ) для интерпретации для меня. Он переводит между C синтаксис и английский.
Например, я ввел ваш пример,
void *foo()
и он вернулсяЧтобы увидеть, как будет выглядеть другой синтаксис, я ввел
declare foo as pointer to function returning void
и он вернулсяЭто особенно полезно, когда у вас есть несколько уровней типов, звездочек или скобок в одном выражении.
источник
Это функция, возвращающая указатель на
void
.Подумайте о своем заявлении так:
Это была бы функция, возвращающая
void
(или ничего):Подумайте о вышеупомянутой декларации так:
Гораздо проще написать это с помощью
typedef
s:Как правило, это устраняет путаницу вокруг указателей на функции и намного легче читать.
источник
Объявления в C / C ++ читаются из идентификатора наружу после приоритета оператора .
Беглый взгляд на таблицу приоритетов операторов C / C ++ в Википедии показывает, что оператор вызова функции
()
имеет более высокий приоритет, чем оператор косвенного обращения*
. Итак, ваши объявления функций выглядят так:Начать с идентификатора:
function
естьfunction()
функция, которая не принимает аргументовvoid* function()
и возвращаетvoid*
.Этот общий принцип также применим к объявлениям массивов (
[]
также имеет более высокий приоритет, чем*
) и комбинациям этих двух. Такчитается как
arr
являетсяarr[42]
массив из 42 элементов, которые*arr[42]
указатели на(*arr[42])()
функции, которые не принимают аргументов иint *(*arr[42])()
вернутьint*
.Требуется немного времени, чтобы привыкнуть к этому, но как только вы поймете принцип, легко будет однозначно прочитать эти декларации.
источник