int *func(void)
Определяет функцию с именем func
, который не имеет параметров и возвращает указатель на целое
int(*func)(void)
Определяет указатель на функцию, которая не имеет параметров и возвращает целое число
Причина для этой разницы приоритет оператора. Parerenteses имеют более высокую точность, чем *
. Поэтому в первом выражении int *func()
скобки функций имеют наивысший приоритет и считаются первыми, поэтому связываются с символом func
, поэтому компилятор знает, что func
является символом для функции. Поэтому остальное - это возвращение.
Во втором случае int(*func)()
есть дополнительный набор круглых скобок. Внутри первой круглой скобки мы видим *func
. Поскольку скобка является наивысшей вероятностью (слева направо), компилятор должен интерпретировать содержимое этого набора ... *func
- это указатель. ОК указатель на что? Посмотрите правду, и мы видим ()
, поэтому это указатель на функцию. Затем посмотрите влево, чтобы увидеть тип возврата.
Надеюсь, что это имеет смысл :) Также попробуйте How to interpret complex C/C++ declarations на CodeProject.com. В нем говорится о чем-то под названием «Правое право», которое является «... простым правилом, которое позволяет вам интерпретировать любое объявление ...». Это немного больше, чем на полпути вниз по странице ...
Также попробуйте cdecl: C gibberish ↔ English. Это довольно хорошая реализация утилиты cdecl
.
функция объявлена с '()' принимает неопределенное количество и тип (ы) аргументов. Это устаревшая форма, которая, вероятно, не должна использоваться в новом коде. Если ваша функция не принимает аргументов, используйте '(void)', а не '()'. (C++ использует '()' для обозначения никаких аргументов, но C++ - это другой язык.) –