В ходе длительного обсуждения в комментариях выяснилось, что этот вопрос действительно о точном значении комментария в скобках в §6.2.1 / 2: «Прототип функции являетсяобъявление функции, которая объявляет типы ее параметров. "
Насколько я вижу, формального определения фразы" прототип функции "не существует, и в стандарте она используется различными способами.,Например:
§6.2.7 / 3 Совместимый тип и составной тип:
Если только один тип является типом функции со списком типов параметров (прототип функции), составной тип является прототипом функции со списком типов параметров.
В этом случае первое использование «прототипа функции», очевидно, не ограничивается объявлением функции, посколькуговорит "тип функции" - это может быть тип, неявно созданный во время разрешения объявления указателя на функцию - и второе использование "прототипа функции" может вообще не иметь синтаксического представления, поскольку это типсозданный в ходе алгоритма составного типа
§6.5.2.2 Вызовы функций
Здесь параграф 2 применяется к функциям с «типом, включающим прототип»в то время как в параграфе 6 функции сравниваются с «типом, который не включает в себя прототип», с функциями с «типом, который включает в себя прототип».Такое использование несовместимо с приведенным выше «определением» «прототипа функции», поскольку это определение относится к типу функции в целом, тогда как использование здесь «прототипа» явно говорит о части типа функции.
§6.7.6.3 Деклараторы функций (включая прототипы)
Этот заголовок раздела можно интерпретировать как либо обо всех «деклараторах функций», включая те, которые оказались «прототипами»,или о «деклараторах функций» и «прототипах», которые могут быть включены.
§6.9.1 / 7 Определения функций
Если деклараторвключает в себя список типов параметров, список также указывает типы всех параметров;такой декларатор также служит прототипом функции для последующих вызовов той же функции в том же модуле перевода.
Здесь фраза «прототип функции», по-видимому, говорит о чем-то, связанном или содержащемся втип функции, но для которого декларатор функции может использоваться как прокси («служит как»).
Я полагаю, что это не будет соответствовать стандартам формальной строгости работы, такойкак Principia Mathematica , но это соответствует большинству юридических спецификаций и другим стандартам, в которых для толкования некоторых отрывков необходим здравый смысл.
Действительно, сама цитата, о которой идет речь:
"Прототип функции - это объявление функции, которая объявляет типы ее параметров."
подразумевает, что параметры в списке параметров имеют тип объявлений , а не просто спецификации (если действительно естьразница между этими двумя фразами).
Кроме того, если мы деконструируем §6.2.1 / 4 (цитируется частично ниже), мы видим, что он говорит, что:
Каждый другой идентификатор [то есть, кроме метки или имени макроса] имеет область действия, определяемую размещением его объявления (в описателе или спецификаторе типа).
и затем переходит кперечислите только три альтернативы для «объявления или спецификатора типа, который объявляет идентификатор»:
«появляется вне любого блока или списка параметров»
«появляется внутри блока» или «в списке объявлений параметров в определении функции»
"появляется в списке объявлений параметров в прототипе функции (не входит в определение функции)"
Предполагается, что эти три возможности являются исключительными (так чтоположения не упорядочены) и являются исчерпывающими (поскольку они должны применяться к «каждому идентификатору»).Затем здравый смысл должен привести нас к предположению, что прототип функции является декларатором функции, который включает в себя список параметров или (в некоторых контекстах) некоторое подмножество или семантическую абстракцию из этой синтаксической конструкции, поэтому ответ на ваш первый вопрос «Даэто намерение стандарта ".
Является ли это недостатком стандарта или нет, это вопрос мнения, в котором я не хочу участвовать.Я проверил то, что я считаю самым последним списком] (http://www.open -std.org / jtc1 / sc22 / wg14 / www / docs / n2244.htm ) и не нашел ничего значимого, посколькуЯ знаю, что об этом не сообщалось как о дефекте.
Ниже следует некоторая версия моего первоначального ответа на случай, если он будет полезен для людей, читающих комментарии.
Что стандарт говорит о сфере примененияиз идентификаторов в списках параметров мне кажется вполне понятным.§6.2.1 / 4 определяет две возможные области действия для идентификаторов, объявленных в списке параметров (выделение выделено):
Если описатель или спецификатор типа, который объявляет идентификатор, появляется внутри блока или в спискеобъявления параметров в определении функции , идентификатор имеет область действия блока , которая заканчивается в конце соответствующего блока.
Если описатель или спецификатор типа, который объявляетидентификатор появляется в списке объявлений параметров в прототипе функции ( не входит в определение функции ), идентификатор имеет область действия прототипа функции , которая заканчивается в конце объявления функции.(§6.2.1 / 4)
В примере, о котором идет речь, декларатор struct s
представляет собой параметр-list , который в точности является списком параметровдекларации».Таким образом, применяется второе предложение, и их область действия ограничивается самим списком параметров.Это делает struct
практически бесполезным, поэтому компилятор предупреждает вас.
Если спецификатор типа структуры появился в списке параметров определения, он мог бы использоваться внутри тела функции, но ни одного экземпляра этой структурыможет быть передано функции из модуля перевода, в котором появляется определение.
Я полагаю, что цель стандарта заключалась в том, чтобы объявление спецификаторов типов для теговых типов появлялось вне списков параметров.Это подтверждается языком § 6.7.2.3 (Теги):
- Контент определенного типа должен определяться не более одного раза.
А
Два объявления типов структуры, объединения или перечисления, которые находятся в разных областях или используют разные теги, объявляют разные типы.Каждое объявление типа структуры, объединения или перечислимого типа, которое не включает тег, объявляет отдельный тип.