Есть ли какие-то преимущества в том, чтобы не использовать прототипы функций в C?


Я работаю с некоторым кодом на языке Си, который не содержит прототипов функций для определенного класса функций. Есть ли какие-то преимущества в том, чтобы не использовать прототипы функций? Функции никогда не вызывают друг друга и не имеют параметров. Код сильно меняется, так что, может быть, осталось всего на одну строку меньше?

9 2

9 ответов:

Прототипы функций предназначены для внешних функций. Мое правило состоит в том, что каждая нестатическая функция получает прототип, кроме main(). Я использую опцию GCC "- Wmissing-prototypes". Обычно это происходит, когда я забываю объявить функцию статической.

Также объявите функции в C следующим образом:

void function(void);

А не так:

void function();

Потому что второй способ означает, что функция принимает неопределенное число параметров, а это не то, что вы хотите (это для совместимости с пре-Анси с).

Нет .

И я не знаю, законно ли это вообще в строгом ansi c.

"код сильно меняется" применительно к прототипам функций-это тоже плохой запах кода. Если интерфейс (сигнатура функции) сильно меняется, то обязанности функции, вероятно, не очень ясны. Сначала работайте над тем, чтобы понять, как разделить проблему на субответы, и только после этого начинайте писать код.

" так, может быть, это просто одна строка меньше, чтобы редактировать?"

Это единственная возможная "выгода" в данном случае-обычная лень.

Меньше кода для изменения - это единственное "преимущество", которое я могу придумать. Обычно это просто "ленивый"

В любом случае, недостатки более существенны: вы должны иметь все функции в одном исходном файле; порядок функций в исходном файле теперь имеет значение и т. д. Кроме того, другие люди будут сбиты с толку, глядя На/для файла заголовка...лучшая практика заключается в том, чтобы .с и .ч это.

Единственное преимущество, которое я вижу, заключается в том, что вам не нужно обновлять прототипы функций каждый раз, когда вы изменяете сами функции.

Код сильно меняется, так что, возможно, это всего на одну строку меньше, чтобы отредактировать?

Я бы предположил, что это причина. Я не могу придумать никакой другой причины - ни скорость компиляции не меняется (практически), ни время выполнения, просто время обновления кода.

Единственное преимущество, которое я могу придумать, это то, что вам не нужно копировать и вставлять первую строку функции в раздел прототипов вашего .С или .H файл.

Для функций, на которые ссылаются другие файлы, у вас нет выбора, кроме как иметь прототип.

Для функций с областью видимости файла (т. е. статических функций) полезно иметь все прототипы в блоке в верхней части файла. Таким образом, любая статическая функция может быть вызвана другой из любого места в этом файле. Без прототипов функция A () может вызывать функцию B () только в том случае, если B () объявлен над ней в коде.

Кроме того, некоторые компиляторы будут делать небезопасные предположения о параметрах, если в области видимости нет прототипа.

Кроме того, если вы пишете код, который должен соответствовать MISRA-C, требуется, чтобы все функции имели прототип в области видимости.

Я также выступаю за то, чтобы прототип содержал имена параметров, а не только их типы (что является законным), как это уточняет назначение параметров, просто взглянув на прототип.

Он меньше печатает, так что, возможно, это уменьшает ваш риск для RSI.