Есть ли какие-то преимущества в том, чтобы не использовать прототипы функций в C?
Я работаю с некоторым кодом на языке Си, который не содержит прототипов функций для определенного класса функций. Есть ли какие-то преимущества в том, чтобы не использовать прототипы функций? Функции никогда не вызывают друг друга и не имеют параметров. Код сильно меняется, так что, может быть, осталось всего на одну строку меньше?
9 ответов:
Прототипы функций предназначены для внешних функций. Мое правило состоит в том, что каждая нестатическая функция получает прототип, кроме main(). Я использую опцию GCC "- Wmissing-prototypes". Обычно это происходит, когда я забываю объявить функцию статической.
Также объявите функции в C следующим образом:
void function(void);
А не так:
void function();
Потому что второй способ означает, что функция принимает неопределенное число параметров, а это не то, что вы хотите (это для совместимости с пре-Анси с).
"код сильно меняется" применительно к прототипам функций-это тоже плохой запах кода. Если интерфейс (сигнатура функции) сильно меняется, то обязанности функции, вероятно, не очень ясны. Сначала работайте над тем, чтобы понять, как разделить проблему на субответы, и только после этого начинайте писать код.
" так, может быть, это просто одна строка меньше, чтобы редактировать?"
Это единственная возможная "выгода" в данном случае-обычная лень.
Меньше кода для изменения - это единственное "преимущество", которое я могу придумать. Обычно это просто "ленивый"
В любом случае, недостатки более существенны: вы должны иметь все функции в одном исходном файле; порядок функций в исходном файле теперь имеет значение и т. д. Кроме того, другие люди будут сбиты с толку, глядя На/для файла заголовка...лучшая практика заключается в том, чтобы .с и .ч это.
Единственное преимущество, которое я вижу, заключается в том, что вам не нужно обновлять прототипы функций каждый раз, когда вы изменяете сами функции.
Код сильно меняется, так что, возможно, это всего на одну строку меньше, чтобы отредактировать?
Я бы предположил, что это причина. Я не могу придумать никакой другой причины - ни скорость компиляции не меняется (практически), ни время выполнения, просто время обновления кода.
Единственное преимущество, которое я могу придумать, это то, что вам не нужно копировать и вставлять первую строку функции в раздел прототипов вашего .С или .H файл.
Для функций, на которые ссылаются другие файлы, у вас нет выбора, кроме как иметь прототип.
Для функций с областью видимости файла (т. е. статических функций) полезно иметь все прототипы в блоке в верхней части файла. Таким образом, любая статическая функция может быть вызвана другой из любого места в этом файле. Без прототипов функция A () может вызывать функцию B () только в том случае, если B () объявлен над ней в коде.
Кроме того, некоторые компиляторы будут делать небезопасные предположения о параметрах, если в области видимости нет прототипа.
Кроме того, если вы пишете код, который должен соответствовать MISRA-C, требуется, чтобы все функции имели прототип в области видимости.Я также выступаю за то, чтобы прототип содержал имена параметров, а не только их типы (что является законным), как это уточняет назначение параметров, просто взглянув на прототип.