Бьерн Страуструп - Абстракция данных в языке С++ - Тип аргументов
ОГЛАВЛЕНИЕ
Тип аргументов
В приведенных выше примерах были описаны аргументы функции.
Этого нельзя было сделать в старом С. Кроме того не приемлим
синтаксис описания аргумента, использованный для s e t _ d a t e .
В С++ семантика передачи аргументов идентична инициализации.
В частности, выполняются обычные арифметические преобразования.
Описание функции, в которой не указываются типы аргументов
например, n e x t _ t o d e y , означает, что эта функция не
приемлет аргументов вообще. В этом отличие от старого С см. ниже
секцию 2."Реализация и совместимость". Типы аргументов всех описаний
и определения функции должны точно совпадать.
Тем не менее имеется возможность вводить функции с неопределенным
и возможно переменным числом аргументов неопределенных типов,
однако такое отступление от типового контроля должно быть явно указано.
Например :
int wild ( ... );
int fprintf (FILE*, char* ...);
Многоточие определяет, что любые (или никакие) аргументы будут
приняты без контроля или преобразования точно так как в старом С.
Например :
wild (); wild ("asdf" , 10); wild (1.3, "ghjk", wild);
fprintf (stdout, "x=%d" , 10);
fprintf (stderr, "file %s line %d\n", f_name, l_no);
Заметьте, что первые два аргумента f p r i n t f должны
присутствовать и будут проконтролированы. Следует обратить
внимание однако, что функции с частично определенными типами
аргументов значительно реже используются в С++, чем в старом С
Такие функции преимущественно используются для описания интерфейсов
со старыми С-библиотеками. Вместо этого используются :
- аргументы функции по умолчанию (секция 9),
- перегрузка имен функций (секция 7),
- перегрузка знаков операций (секция 8).
См.также секцию 18.
Как и раньше необъявленные функции могут быть использованы
в предположении, что они возвращают целое значение. Они должны однако,
использоваться согласованно. Например:
undef (1, "asdf"); undef1(2, "ghjk"); /* правильно */
undef2(1, "asdf"); undef2("ghjk", 2); /* ошибочно */
Несогласованное использование u n d e f будет обнаружено компилятором.