Бьерн Страуструп - Абстракция данных в языке С++ - Тип аргументов

ОГЛАВЛЕНИЕ

 

Тип аргументов

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