Что работает до main()?
После тестирования на msvc8 я обнаружил:
- Parse GetCommandLine() для argc и argv
- Инициализация стандартной библиотеки C
- С++ Конструктор глобальных переменных
Эти три вещи вызываются перед вводом main().
Мои вопросы:
- Будет ли этот порядок выполнения отличаться при переносе моей программы на другой компилятор (gcc или armcc) или на другую платформу?
- Что делает инициализация стандартной библиотеки C? До сих пор я знаю, что setlocale() является обязательным.
- Безопасно ли вызывать стандартные функции C внутри конструктора С++ глобальных переменных?
Ответы
Ответ 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.