Программирование. Принципы и практика использования C++ Исправленное издание, стр. 386
}
f()f()К сожалению, это определение в другом исходном файле может выглядеть следующим образом:
/* other_file.c: */int f(char* p){ int r = 0; while (*p++) r++; return r;}Редактор связей не сообщит об этой ошибке. Вместо этого вы получите ошибку на этапе выполнения программы или случайный результат.
#includelintВы можете попросить включить проверку аргументов функций в языке С. Для этого достаточно объявить функцию с заданными типами аргументов (точно так же, как в языке С++). Такое объявление называется прототипом функции (function prototype). Тем не менее следует избегать объявлений, не задающих аргументы; они не являются прототипами функций и не включают механизм проверки типов.
int g(double); /* прототип — как в языке С ++ */int h(); /* не прототип — типы аргументов не указаны */void my_fct(){ g(); /* ошибка: пропущен аргумент */ g("asdf"); /* ошибка: неправильный тип аргумента */ g(2); /* OK: 2 преобразуется в 2.0 */ g(2,3); /* ошибка: один аргумент лишний */ h(); /* Компилятор допускает! Результат непредсказуем */ h("asdf"); /* Компилятор допускает! Результат непредсказуем */ h(2); /* Компилятор допускает! Результат непредсказуем */ h(2,3); /* Компилятор допускает! Результат непредсказуем */}
h()h()lint
Существует специальный набор правил, регламентирующих преобразование аргументов, если в области видимости нет прототипа функции. Например, переменные типов
charshortintfloatdoublelongОбратите внимание на то, что, хотя компилятор допускает передачу аргументов неправильного типа, например параметр типа
char*27.2.3. Определения функций
Можете определять функции точно так же, как в языке С++. Эти определения являются прототипами функций.
double square(double d){ return d*d;}void ff(){ double x = square(2); /* OK: переводим 2 в 2.0 и вызываем */ double y = square(); /* пропущен аргумент */ double y = square("Hello"); /* ошибка: неправильный тип аргументов */ double y = square(2,3); /* ошибка: слишком много аргументов */}Определение функции без аргументов не является прототипом функции.
void f() { /* что-то делает */ }void g(){ f(2); /* OK в языке C; ошибка в языке C++ */}Код
void f(); /* не указан тип аргумента */означающий, что функция
f()void