Правила для неявного возвращаемого типа int в объявлениях функций ANSI C

Я знаю, что f(void) { return 0; } f(void) { return 0; } имеет возвращаемый тип int , даже если он не указан, но как насчет следующего:

(*f())[]{}

(*g())(){}

const*h(){}

Это скомпилировано без ошибок на gcc с -ansi -Werror -pedantic и только жаловалось на отсутствующий оператор возврата в clang: https://godbolt.org/z/jAYL4v

Похоже, что f имеет возвращаемый тип int(*)[] , g имеет возвращаемый тип int(*)() , а h имеет возвращаемый тип const int* .

В стандарте ANSI C я не могу найти правило для этого. Я проверил [6.5.4.3 объявления функций (включая прототипы)] и [6.7.1 определения функций], но даже не смог найти ничего по неявному типу возвращаемого значения int (за исключением некоторого примера кода). Я просто смотрю не в том месте? Это действительный код?

Всего 1 ответ


Грамматика для определений функций (C89 3.7.1):

определение-функции: спецификаторы объявления opt объявление-список объявлений opt составной-оператор

это то же самое, что C99, за исключением того, что спецификаторы объявления являются необязательными в C89.

Значения этих грамматических терминов:

  • спецификаторы объявления - это любая комбинация спецификатора класса хранения, спецификатора типа и спецификатора типа ; примеры которых являются static , float , const соответственно.
  • Декларатором , неофициально, является все, что может появиться здесь: int ______ ; , Конечно, есть формальное определение, но я упоминаю этот подход, чтобы вы могли связать терминологию с вашим существующим пониманием синтаксиса объявления.
  • список объявлений относится к объявлениям параметров в стиле K & R.
  • составной оператор - это ограниченный список операторов (возможно, пустой).

В вашем вопросе следующие деклараторы: (*f())[] (*g())() *h() . Так что законно, чтобы за ними следовал {} (что является составным утверждением ). У h также есть спецификатор объявления .

В C89 также существует правило (3.5.2), согласно которому указание типа в наборе спецификаторов объявления не является эквивалентом предоставления int . C99 добавил ограничение «По крайней мере один спецификатор типа должен быть указан в спецификаторах объявлений в каждом объявлении [...]».


Есть идеи?

10000