Сообщение от dosikus
|
И если вы внимательно читали K&R , у него нигде не упоминалось эта мерзость
#include xxx.c . Напротив , везде подключаются только заголовки .
|
Dosicus, Вы хороший специалист, но иногда грешите излишней категоричностью.
У меня есть все статьи тестера и его OSA. Спасибо ему за большую работу.
Кстати вот цитата из тестера:
"Для некоторых программистов, привыкших писать текст программы одним
файлом (или включать в Си-файл другие Си-файлы директивой #include),
вызывает трудность оформление и подключение независимых модулей,"
Любой программист может проверить включение файлов.с.
Нужно вынести любую функцию из программы в отдельный файл и затем включить этот файл через #include.
Подключение нужно производить после определения всех переменных. Как я понял, допускается подключение этого файла непосредственно перед первым использованием вынесенной функции. Мне удобнее подключать все вынесенные файлы перед main в порядке их использования.
K&R "Любая строка вида
«include "имя-файла"
или
«include ‹имя-файла›
заменяется содержимым файла с именем имя-файла. "
Такие дискуссии полезны тем, что заставляют пересмотреть устоявшиеся внутренние стереотипы.
"В языке СИ нет строгого требования к месторасположению
определения функции и точки ее вызова. Определения используемых
функций могут следовать за определением функции main, перед ним, или
находится в другом файле.
Если объявление функции не задано, то по умолчанию строится
прототип функции на основе анализа первой ссылки на функцию, будь то
вызов функции или определение. Однако такой прототип не всегда
согласуется с последующим определением или вызовом функции.
Рекомендуется всегда задавать прототип функции."
Пользуясь тем что, компилятор не возмущался, я не задавал прототип функции для подключаемых файлов и похоже зря :
"Если прототип функции не задан, а встретился вызов функции, то
строится неявный прототип из анализа формы вызова функции. Тип
возвращаемого значения создаваемого прототипа int, а список типов и
число параметров функции формируется на основании типов и числа
фактических параметров используемых при данном вызове.
Таким образом, прототип функции необходимо задавать в следующих
случаях :
• Функция возвращает значение типа, отличного от int.
• Требуется проинициализировать некоторый указатель на
функцию до того, как эта функция будет определена."
Язык С чересчур гибок и поэтому появилась misra c.