2017-02-12 10 views
1

Прототип для определения функции, которая возвращает указатель выглядит следующим образом:Что в синтаксических правилах делают прототипы функций, которые возвращают указатели и указатели на функции?

int * function_name(); 

В то же время, прототип для указателя функции выглядит следующим образом:

int (*function_name)(); 

правило Что синтаксиса делает те два определения разные? Как начинается приоритет?

Например, это

(int *) function_name(); 

прототип для функции, которая возвращает указатель или указатель на функцию? (Моя интуиция заключается в том, что она определяет функцию, которая возвращает (int *), и, следовательно, является первой.)

Редактировать: Я понял, что мой вопрос на самом деле о декларации C. Хороший ресурс для понимания тех, кто является http://unixwiz.net/techtips/reading-cdecl.html

+0

Синтаксис C явно не идеален. – Stargateur

+1

Попробуйте функцию, которая возвращает указатель на функцию. – DeiDei

+0

Несознание - это неприятный бизнес, но это должно быть сделано. К счастью, мы можем использовать typedefs для облегчения неловкости. – StoryTeller

ответ

1
(int *) function_name(); 

как функция прототипом является ошибкой синтаксиса.
При вызове function_name(); таким образом, это отбрасывает возвращаемое значение в int *:

int main(void) { 
    (int *) function_name(); //the return value is being casted to an `int *` 
    return 0; 
} 

Следующая функция, которая возвращает указатель:

int *function_name(); 

И следующий указатель функции , т.е. указатель на функцию:

int (*function_name)(); 

Сошлюсь this:

Иногда люди путают, когда больше звезд выбрасываются в:
void *(*foo)(int *);
Здесь, ключ для чтения наизнанку; обратите внимание, что самый внутренний элемент выражения - * foo, и в противном случае он выглядит как объявление нормальной функции. * foo должен ссылаться на функцию, которая возвращает void * и принимает int *. Следовательно, foo является указателем на такую ​​функцию.

2

Какие правила синтаксиса делают эти два определения разными?

Правило для парсинга:

  1. Найдите идентификатор.
  2. Всегда отдавайте предпочтение [] и () над *.

Таким образом, для int * function_name();, идентификатор function_name будет идет с () вместо * и поэтому function_name объявляется как функция, которая возвращает указатель на int.

Для int (*function_name)();, Дополнительный внешний скобка сила function_name к поставляется с *, а не (). Таким образом, это объявляет function_name в качестве указателя на функцию, которая возвращает int.

(int *) function_name(); не может быть использован вне функции. Компилятор сообщит о синтаксической ошибке. При просмотре (int *) компилятор будет интерпретироваться как оператор трансляции и function_name() как вызов функции.


Дополнительная информация: Deciphering complex declaration like void (*(*f[])())().

+1

'(int *) function_name();' является синтаксисом синтаксиса C, но он не может использоваться вне тела функции. – rici

+0

@rici; Да. Моя формулировка неверна. Исправлено это. – haccks

0

OK, поэтому применение правил чтения деклараций C (например, here):

int * function_name(); 

декларирует function_name как функция, возвращающая указатель на int, в то время как

int (* function_name)(); 

объявляет function_name как указатель к функции, возвращающей int.