В соответствии со стандартами языка -- не могут. Но есть расширения (в частности, у gcc), позволяющие определять функции вложенные в другие функции.
Зачем? Вложенные функции -- это лямбды, которые были до лямбд С++.
Не могут. Но, кстати, «основная» функция может называться не обязательно main, — это определяется на этапе компоновки и так обстоит дело при компоновке откомпилированного кода со стандартным загрузчиком для консольных приложений.