Вот как получить указатель на функцию main
:
#define DECLARE_UNUSED( name ) (void) name; struct name
int main()
{
int(*ptr)() = &main;
DECLARE_UNUSED( ptr ); // Prevents using `ptr`.
// Don't use `ptr` here. In particular, don't call.
}
Обратите внимание, что
main
должен иметь тип результата int
.
вызов main
(например, через этот указатель) приводит к неопределенному поведению.
Нет необходимости возвращать что-либо из main
;возвращаемое значение по умолчанию равно 0.
Как видите, main
- это особая функция.
Эти правила (в общем случае) не применяются к другим функциям.
Также обратите внимание, что Visual C ++ неверен в том, что не диагностирует void
тип результата.
Наконец, обратите внимание, что написание нестандартного void
на один символ больше, чем тип int
то есть это очень, очень глупая вещь.; -)
PS: Visual C ++ , вероятно, бормотает о int main
, потому что он (вероятно) переводит void main
в int main
внутри, и, вероятно, это делает это, чтобы сделать вещисвязываться с неинтеллектуальным компоновщиком, активно поддерживая void main
, так что, например, будут собраны собственные нестандартные примеры Microsoft в их документации.В любом случае, это моя теория # 1, так как вы спрашиваете.Но это, конечно, чисто догадки, и даже те, кто их кодировал, не имеют четкого представления о том, почему (теория № 2).