Подтвердить что ты не робот

Что работает до main()?

После тестирования на msvc8 я обнаружил:

  • Parse GetCommandLine() для argc и argv
  • Инициализация стандартной библиотеки C
  • С++ Конструктор глобальных переменных

Эти три вещи вызываются перед вводом main().

Мои вопросы:

  • Будет ли этот порядок выполнения отличаться при переносе моей программы на другой компилятор (gcc или armcc) или на другую платформу?
  • Что делает инициализация стандартной библиотеки C? До сих пор я знаю, что setlocale() является обязательным.
  • Безопасно ли вызывать стандартные функции C внутри конструктора С++ глобальных переменных?
4b9b3361

Ответ 1

1: Будет ли этот порядок выполнения отличаться при переносе моей программы на другой компилятор (gcc или armcc) или на другую платформу?

Да.

2: Что делает инициализация стандартной библиотеки C? До сих пор я знаю, что setlocale() является обязательным.

Я уверен, что есть другие вещи. Вы не должны полагаться на использование каких-либо глобальных объектов после запуска main. Это означает, что такие вещи, как std-потоки (std:: cin, std:: cout), могут не использоваться.

3: Безопасно ли вызывать стандартные функции C внутри конструктора С++ глобальных переменных?

Возможно, нет.

Ответ 2

Здесь статья из статьи LSB (Стандартная база Linux), описывающая, что __libc_start_main может делать в Linux.

В частности:

* performing any necessary security checks if the effective user
  ID is not the same as the real user ID.
* initialize the threading subsystem.
* registering the rtld_fini to release resources when this dynamic
  shared object exits (or is unloaded).
* registering the fini handler to run at program exit.
* calling the initializer function (*init)().
* calling main() with appropriate arguments.
* calling exit() with the return value from main().

И здесь более подробное объяснение.

Это определенно отличается от Windows.