Прототип функции объявлен внутри main - лучшие практики? - PullRequest
9 голосов
/ 02 июня 2009

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

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

#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);
}

Ответы [ 5 ]

16 голосов
/ 02 июня 2009

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

  • делает код для основного длиннее
  • это может ввести новичка в заблуждение, что он ограничен функцией main
  • в реальном коде я обычно помещаю функцию в другой модуль компиляции и #include его заголовочный файл
5 голосов
/ 02 июня 2009

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

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

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

4 голосов
/ 02 июня 2009

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

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

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

Это делает код менее читабельным. Для меня такая практика - явный признак запаха кода.

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

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...