Синтаксис указателя на функцию C общеизвестно уродлив и труден для понимания.По сути, ответ заключается в том, что так должно быть, потому что так решили разработчики языка C.
void *(*start_routine) (void *)
ссылается на указатель на функцию, принимающую один параметр типа void *
, ивозвращение void *
.
Первый приведенный вами пример void (*start_routine)(void *)
также является указателем функции и также принимает параметр void *
, но ничего не возвращает.
Другой пример,void (start_routine)(void *)
не является указателем на функцию и ничего не возвращает.Круглые скобки на самом деле не служат какой-либо цели, и это было бы то же самое, что написать void start_routine(void *)
, который, я уверен, не допускается в качестве типа параметра.
Редактировать: этот фактически разрешен какпараметр, но он не так широко используется и все еще имеет неправильный тип возврата.
Надеюсь, что все прояснится.