Страница 5 из 25 Тип аргументов В приведенных выше примерах были описаны аргументы функции. Этого нельзя было сделать в старом С. Кроме того не приемлим синтаксис описания аргумента, использованный для 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 будет обнаружено компилятором. |