Могу ли я заменить код в main () в конструктор глобального объекта? - PullRequest
1 голос
/ 08 июля 2011

Предполагая , что init - это последний глобальный объект, инициализированный перед main() (и нам не нужен аргумент командной строки), могу ли я сделать что-то вроде:

struct int_main {
  int_main ()
  {
    //... start code execution
  }
}init;

int main ()
{
}

Задавая вопрос таким образом, потому что мне интересно знать, если main() гарантирует что-то кроме:

  1. argc, argv из командной строки
  2. Все глобальные объекты инициализированы до этого

Ответы [ 4 ]

5 голосов
/ 08 июля 2011

У вас нет гарантии, что все глобальные объекты созданы до вашего объекта, поэтому вы не можете использовать ни один из них.Это включает жизненно важные части iostreams.

Обычно я использую шаблон, который main() просто создает объект приложения и вызывает метод для его выполнения для фактической работы.

4 голосов
/ 08 июля 2011

Вам будет трудно поймать любое исключение из конструктора int_main.

Также вам будет трудно вернуть код завершения процесса с полным разматыванием стека.

Это главным образом то, что main предоставляет в C ++: место для перехвата исключений и средство для нормального возврата (не просто exit) с указанным кодом завершения процесса.

Приветствия & hth.,

0 голосов
/ 08 июля 2011

В C \ C ++ вы можете объявить точку входа вашего приложения через Visual Studio IDE. Это соглашение, что точка входа в ваш код будет либо Main, либо Win32 WinMain exe.

Что касается ответа на ваш вопрос, CRT будет инициализировать все глобальные переменные в порядке

C Примитивные типы
Типы структур C и / или типы классов C ++
Вызов конструкторов класса
Позвоните в вашу точку входа, это будет сделано из CRTStartup (поправьте меня, если я ошибаюсь)

0 голосов
/ 08 июля 2011

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

Кроме того, поскольку среда выполнения ОС будет вызывать вашу фактическую функцию main(), чтобы фактически «запустить» вашу программу независимо от наличия «основного» глобального объекта или нет, вам нужно будет вернуть значение из 'main () `, чтобы среда выполнения ОС могла определить состояние выхода вашей программы.

...