Pular para o conteúdo

Como é possível funcionar esse programa em C++? [RESOLVIDO]

Responder tópico
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.
  • Denunciar
  • Indicar

1. Como é possível funcionar esse programa em C++? [RESOLVIDO]

Enviado em 07/12/2021 - 11:33h

Bom dia a todos

O Exemplo abaixo, não lembro onde aprendi, encontrei hoje em minhas anotações.

Minha dúvida é:
Como isso funciona?
Entendo que x é um Inteiro, como ele pode receber um printf?
E se o main está vazio, quem afinal imprime na tela?
#include <bits/stdc++.h>
int x = printf("Hello World\n");
int main(){}

Responder tópico

O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

2. Re: Como é possível funcionar esse programa em C++?

Melhor resposta

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)

Responder tópico

O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

Responder tópico

Entre na sua conta para responder.

Fazer login para responder