Ускоряет ли использование прототипа + определение вместо простого определения? - PullRequest
1 голос
/ 02 июня 2011

Я очень плохо знаком с программированием на C, но имею ограниченный опыт работы с Python, Java и Perl. Мне было просто интересно, в чем преимущество наличия прототипа функции выше main () и определения этой функции ниже main (), а не просто определения указанной функции выше main (). Из того, что я прочитал, определение может выступать и в качестве прототипа.

Заранее спасибо,

Ответы [ 4 ]

6 голосов
/ 02 июня 2011

Использование прототипа выше main() (в пределах одного модуля) в основном зависит от личных предпочтений.Некоторым людям нравится видеть main() внизу файла;другие люди любят видеть это наверху.У меня был профессор в университете, который жаловался, что я написал свои программы "вверх ногами", потому что я поставил main() внизу (и избегал необходимости писать и поддерживать прототипы для всего).

Есть одна ситуациягде может потребоваться прототип:

void b(); // prototype required here

void a()
{
    b();
}

void b()
{
    a();
}

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

3 голосов
/ 02 июня 2011
  • Когда кто-то еще хочет использовать вашу библиотеку, вы можете дать им заголовок (содержащий прототипы), не давая им свой код.

    Пример?Windows SDK.

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

Существует* не влияет на производительность * скомпилированного кода.

* Примечание: Ну, я думаю, может быть.Если компилятор решит поместить метод где-то еще в двоичном файле, то вы теоретически можете увидеть проблемы с локальностью, влияющие на производительность вашего приложения.Это не то, о чем обычно беспокоиться.

2 голосов
/ 02 июня 2011

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

Что касается функций, встроенных в одну единицу перевода (те, которые мы обычно объявляем static), то нет абсолютно никаких причин для создания автономного прототипа, поскольку определение самой функции включает в себя прототип. Просто определите свои функции в естественном порядке: сначала функции низкого уровня, потом функции высокого уровня, и все. Если ваша программа состоит из одного блока перевода, функция main окажется в самом низу.

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

1 голос
/ 02 июня 2011

Если вы напишите свой код в правильном порядке, то есть main last, тогда в вашем коде будет только одно определение для каждой функции.Это предотвращает необходимость изменения кода в двух или более местах, если когда-либо нужно будет внести изменения.Это предотвращает ошибки и сокращает объем работ по его обслуживанию.Принцип называется " единственный источник истины "

...