Настройка
У меня есть несколько вопросов о рекламных акциях по умолчанию при вызове функции в C. Здесь раздел 6.5.2.2 "Вызов функций" Пункты 6, 7 и 8 из стандарт C99 (pdf) (выделение и разбивка на списки для удобства чтения):
Пункт 6
- Если выражение, обозначающее вызываемую функцию, имеет тип, в котором не содержит прототип, целые акции выполняются для каждого аргумента, а аргументы с типом
float
- доdouble
. Они называются рекламными акциями по умолчанию.- Если количество аргументов не равно числу параметров, поведение undefined.
- Если функция определена с типом, в котором содержит прототип, и либо прототип заканчивается эллипсисом (
, ...
), либо типы аргументов после продвижения по службе несовместимы с типами параметров, поведение undefined.- Если функция определена с типом, в котором не содержит прототип, а типы аргументов после продвижения по службе не совместимы с типами параметров после продвижения по службе, поведение undefined, за исключением следующих случаев:
- один продвинутый тип - это целочисленный тип со знаком, другой продвинутый тип - это соответствующий целочисленный тип без знака, и значение представляется в обоих типах;
- Оба типа являются указателями на квалифицированные или неквалифицированные версии типа символа или
void
.
Пункт 7
- Если выражение, обозначающее вызываемую функцию, имеет тип, который содержит прототип, аргументы неявно преобразуются, как если бы по назначению, типам соответствующих параметров, принимая тип каждый параметр является неквалифицированной версией его объявленного типа.
- Обозначение многоточия в деклараторе прототипа функции вызывает преобразование типа аргумента для остановки после последнего объявленного параметра. Активные объявления по умолчанию выполняются по завершающим аргументам.
Пункт 8
- Никакие другие преобразования не выполняются неявно; в частности, количество и типы аргументов не сравниваются с количеством параметров в определении функции, что не включает декларатор прототипа функции.
Что я знаю
- Акциями по умолчанию являются
char
иshort
доint
/unsigned int
иfloat
доdouble
- Необязательные аргументы для вариативных функций (например,
printf
) подчиняются рекламным акциям по умолчанию
Для записи мое понимание прототипа функции таково:
void func(int a, char b, float c); // Function prototype
void func(int a, char b, float c) { /* ... */ } // Function definition
Вопрос
У меня очень тяжелое время. Вот несколько вопросов, которые у меня есть:
- Поведение прототипированных и не прототипированных функций действительно сильно отличается, например, в отношении поощрений по умолчанию и неявных преобразований?
- Когда появляются рекламные акции по умолчанию? Это всегда? Или это только в особых случаях (например, с вариационными функциями)? Это зависит от того, прототипирована ли функция?