хороший тон создавать функцию заранее, а после описывать ее (как в первом варианте) или же можно сразу описывать функцию (как во втором)?
Что в лоб - что по лбу.
Вообще, первичный, первоначальный - как раз способ, который вы назвали 2-й: в C (откуда вырос C++) каждый объект программы должен быть описан (видим) прежде, чем он будет использован. И тогда способ 2-й более естественный.
То, что вы назвали как способ 1-й - это
предварительное описание функции, прототип. Поскольку в C (а затем и в C++ до самого последнего времени) не было выделено таких понятий как модуль, пакет, библиотека (в разных языках это называется по-разному), то в многофайловом приложении у вас просто не будет другого способа совместного использования функций, как использовать прототипы, которые и помещаются в отдельные файлы определений (.h, хэдер-файлы). Это и есть предварительные описания, которые вы и выделили как способ №1.