2009-06-02 3 views
8

Это хороший стиль, чтобы прототип функции был объявлен внутри основной функции?Прототип функции, заявленный внутри основного - лучшая практика?

Я смотрел учебник C, я думаю, что он устарел. Однако они объявляют прототип функции внутри основного. Обычно я объявляю снаружи перед основным.

#include <stdio.h> 

int main() 
{ 
    char myname [30]; 
    int theage; 
    int getage(); 

    printf ("\nEnter your name:"); 
    gets (myname); 
    theage = getage(); 
    printf("\n AGE = %d and NAME = %s", theage, myname); 
    return 0; 
} 

int getage() 
{ 
    int myage; /* local to only getage() */ 

    printf ("\nEnter your age: "); 
    scanf ("%d",&myage); 
    return (myage); 
} 
+0

Я не вижу объявления функции в вашем коде.Вы говорите об основной функции? или основной «файл»? Обратите внимание, что «stdio.h» неверен, это должно быть ... Не могли бы вы уточнить свой вопрос? – LB40

+1

@LB Прототипом функции является строка 6 (int getage();) – nuriaion

+0

+1 для вопроса. Основываясь на следующих ответах, кажется, что объявление прототипа функции в функциях не является хорошей практикой, тогда вопрос о последующей деятельности заключается в том, есть ли какое-либо преимущество в функции main()? – TimeString

ответ

16

лично я бы сказал «нет» по нескольким причинам:

  • это делает код магистральной более
  • это может запутать новичок в думать ИНГАМИ функции является контекстным по основному
  • в реальном коде, я бы обычно помещал эту функцию в другую компиляционную единицу и # включал ее заголовочный файл
+1

4) сложнее найти прототип функции – hiena

1

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

Я согласен с Нилом ...

4

Это не очень хороший стиль.

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

Функция protoypes (и внешние переменные) также может быть объявлена ​​почти везде на c-языке. Однако только потому, что это возможно, не должно быть никаких оснований писать стиль спагетти C.

Это делает код менее читаемым. Для меня такая практика является явным признаком кодового запаха.

5

Я также скажу «нет» с дополнительной причиной, что, если вы начнете использовать явные декларации по всему коду, вы, безусловно, получите неразрешенные внешние значения, когда вызываемая вами функция внезапно изменит свою подпись. Если в ОДНОМ заголовочном файле есть ОДНОЕ объявление, вам нужно только изменить объявление ONE, когда функция изменится.

Однако я бы сказал «да» по следующей причине: если вы просто пишете простой метод тестирования, написанный только для одного использования, то есть, если вы хотите проверить что-то действительно быстро, а затем сразу отбросить функцию , Тогда это может быть отличным, чтобы просто вставить объявление прямо перед тем, как вы хотите позвонить.

Код для производства -> Нет, нет! :)

1

Поскольку я не перескочил через необходимое количество обручей в этом шоу пони, у меня нет выбора, кроме как отправить этот комментарий в качестве ответа.

Имейте в виду, что это всего лишь фрагмент книги, а не тот код, который вы видите в производственной среде. Фрагмент кода хорош, но не идеален. Нейл дал лучший ответ, поэтому я дал ему +1. Я бы отметил его 3-й пункт, если вы действительно хотите знать, как это делается за пределами учебников/текстовых книг.

Кроме того, точка, с которой я их делаю: «stdio.h» - это просто способ сообщить препроцессору, где искать файл stdio.h. Опять же, в большинстве ситуаций вы увидите stdio.h, окруженный <> вместо "". Тем не менее, ваши собственные файлы заголовков, упомянутые 3-м пунктом Нила, будут окружены "".

Смежные вопросы