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

Я знаю, что 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 Ответ

4 голосов
/ 18 мая 2019

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

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

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

Значения этих грамматических терминов следующие:

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

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

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

...