Рассмотрим следующий пример: int main()
{
f(2);
}
[-7Г Компилятор языка С допускает такой код: вы не обязаны объявлять функции
* до их использования (хотя можете и должны). Определение функции f() может находиться где-то в другом месте. Кроме того, функция f() может находиться в другом модуле компиляции, в противном случае редактор связей сообщит об ошибке.
К сожалению, это определение в другом исходном файле может выглядеть следующим образом:
/* other_file.c: */ int f(char* p)
{
int r = 0; while (*p++) r++; return r;
}
Также вам может показаться, что такая тема как http://diadel.ru/products/zimniy_sad/ никак не связана и даже не тематична с программированием. Хотя, может быть и связана.
В любом случае все-таки зайдите на сайт diadel.ru
Тема конструкция зимний сад там представлена весьма широко.
Редактор связей не сообщит об этой ошибке. Вместо этого вы получите ошибку на этапе выполнения программы или случайный результат.
Как решить эту проблему? На практике программисты придерживаются согласованного использования заголовочных файлов. Если все функции, кото-
рые вы вызываете или определяете, объявлены в заголовке, поставленном в соответствующее место программы с помощью директивы #include, будет включен механизм проверки типов. Однако в больших программах на это трудно рассчитывать. Вследствие этого в большинстве компиляторов языка С существуют опции, предусматривающие выдачу предупреждений о вызовах необъявленных функций: воспользуйтесь ими. Кроме того, с первых дней существования языка C появились программы, с помощью которых можно выявлять все возможные проблемы, связанные непротиворечивостью типов. Обычно они называются lint. Используйте их для любой нетривиальной программы на языке С. Вы обнаружите, что программы lint подталкивают вас использовать язык С как подмножество языка С++. Одно из наблюдений, приведших к разработке языка С++, состояло в том, что компилятор мог легко проверять многое (но не все), что могли проверять программы lint.
Вы можете попросить включить проверку аргументов функций в языке С. Для этого достаточно объявить функцию с заданными типами аргументов (точно так же, как в языке С++). Такое объявление называется прототипом функции (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 перехватит ее.
С++
void f(); // предпочтительно
void f(void);
void f(...); // получает любые // аргументы
Эквивалент в языке С
void f(void); void f(void);
void f(); // получает любые // аргументы
Существует специальный набор правил, регламентирующих преобразование аргументов, если в области видимости нет прототипа функции. Например, переменные типов char и short преобразуются в переменные типа int, а переменные типа float — в переменные типа double. Если вы хотите знать, скажем, что произойдет с переменной типа long, загляните в хороший учебник по языку С. Наша рекомендация проста: не вызывайте функций, не имеющих прототипов.
Обратите внимание на то, что, хотя компилятор допускает передачу аргументов неправильного типа, например параметр типа char* вместо параметра типа int, использование таких аргументов приводит к ошибкам. Как сказал Деннис Ритчи: “С — это язык программирования со строгим контролем типов и слабой проверкой”.
Опубликовал katy
April 28 2015 20:57:30 ·
0 Комментариев ·
2950 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.