paulo1205
(usa Ubuntu)
Enviado em 09/12/2021 - 05:15h
Interessante esse exemplo. Eu sabia que o C++ permitia a execução de código fora de
main() para a construção de objetos estáticos (antes de
main()) e sua desconstrução (depois de
main()), mas eu achava que isso seria apenas para classes, não sabia que valia para tipos nativos.
Mas até que faz sentido: um dos objetivos do C++ sempre foi oferecer maneiras de que tipo definidos pelo usuário (sobretudo classes e estruturas) fossem tão parecidos quanto possível com tipos nativos. Se, por um lado, isso implica, por exemplo, poder usar os operadores da linguagem (tais como
+,
-,
<<,
*=,
-> etc.) para operar com objetos de classes à semelhança de tipos nativos, faz sentido também levar recursos de objetos para os tipos nativos.
Nunca tinha visto ser usado desse modo. Vivendo e apendendo! Obrigado pelo exemplo.
Quanto ao modo pelo qual isso funciona, a “mágica” é implementada pelo
linker, que inclui no código executável correspondente ao seu programa algumas outras partes que executam antes de
main() ser invocada e depois que ela retorna. Quando você usa o GCC para gerar o executável final, ele se encarrega de invocar o
linker por você, e você geralmente não toma conhecimento desses blocos de códigos que funcionam como prólogos e epílogos do seu próprio programa. Entretanto, se você quiser (ou tiver de) chamar o
linker diretamente, precisa incluir tais blocos e na ordem correta, a fim de gerar um executável que realmente funcione.
Você pode ler um pouco a respeito disso nesta seção da documentação do GCC (
https://gcc.gnu.org/onlinedocs/gccint/Initialization.html) e nesta postagem do Stack Overflow (
https://stackoverflow.com/questions/22160888/what-is-the-difference-between-crtbegin-o-crtbegint-o-a...).
... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)