Я изучал продвижение аргументов по умолчанию и застрял в одном месте. В C 2011 (ISO / IEC 9899: 2011) соответствующая часть выглядит следующим образом:
§6.5.2.2 Вызов функций
¶6 Если выражение, обозначающее вызываемую функцию, имеет тип, не включающий прототип, целочисленные повышения выполняются для каждого аргумента, а аргументы с типом float повышаются до удвоения. Это называется продвижением аргументов по умолчанию. Если количество аргументов не равно количеству параметров, поведение не определено. Если функция определена с типом, который включает прототип, и либо прототип заканчивается многоточием (, ...), либо типы аргументов после продвижения несовместимы с типами параметров, поведение не определено. Если функция определена с типом, который не включает прототип, и типы аргументов после продвижения несовместимы с типами параметров после продвижения, поведение не определено, за исключением следующих случаев:
- один продвинутый тип - это целочисленный тип со знаком, другой продвинутый тип - соответствующий беззнаковый целочисленный тип, и значение может быть представлено в обоих типах;
- оба типа являются указателями на квалифицированные или неквалифицированные версии символьного типа или void.
В последних трех строках абзаца говорится о типе функции, которая не включает прототип при его определении.
В нем говорится, что если типы аргументов после продвижения несовместимы с типами параметров после продвижения, поведение не определено.
Теперь у меня есть очень глупые сомнения, что если и объявление функции, и определение функции не включают прототип, упомянутый в этом абзаце, то о том, о каких параметрах они говорят в последних трех строках абзаца. И что означают здесь «параметры после продвижения», поскольку я изучал только продвижение аргументов. Что такое «параметр Promotions»?
Вы также можете привести примеры исключительных случаев, упомянутых в последнем. Если бы кто-то мог объяснить это на подходящем примере, это было бы действительно заметно.