Ads 468x60px

quarta-feira, 6 de fevereiro de 2013

Tutorial.: Chamar uma função antes do main(), em C/C++


Durante o aprendizado, somos informados de que o código começa a ser executado pela função main() (ou "método main" em OO), mas e se quisermos executar alguma coisa ANTES do main?! Será que é possível?

Inicialmente, vem à cabeça a seguinte pergunta:

"Para que eu iria querer executar algo antes do main()?"

E a resposta é simples: para fins de logging, billing, polling ou qualquer outro objetivo imaginável proveniente de uma mente doentia de um alguém qualquer em algum lugar do planeta.

"Mas e então... como faz?"

Calma. Para isso é preciso entender o conceito de variáveis globais.
Uma variável global é aquela declarada fora de qualquer função - inclusive do main() -, pode ser de qualquer tipo e pode ser acessada por todos os escopos do código.
Devido ao fato de qualquer função poder utilizá-la e alterá-la, não é uma boa prática de programação pois, ao longo de um código razoavelmente longo, a legibilidade e rastreabilidade da variável pode se tornar bem difícil visto que nunca é necessário passá-la como argumento.

"Se não é uma boa prática, por que eu usaria?"

Em alguns casos, seu uso pode ser bastante útil contanto que haja controle no código, como será o caso que iremos exemplificar.

"É mesmo! Já estava quase esquecendo..."

A dica é criar um objeto global em que, o construtor da classe deste objeto contenha a função (método) que se deseja. Como este objeto é instanciado antes do programa começar a rodar (atráves do main()), essa função será executada antes. Veja o exemplo:

#include <stdio.h>
/*
**Este é um exemplo didático, esta biblioteca é oriunda do C.
**Utilize a que melhor se adapta às suas necessidades
**Boas práticas à parte, nada impede de utilizar conceitos OO em C ao invés de C++
*/

//Protótipo da função/método desejado
void fazerAlgo();

//Declarando uma classe qualquer de nome RedutoNERD
class RedutoNERD{
    public:
        RedutoNERD(){ //O construtor de uma classe possui o mesmo nome da classe
            fazerAlgo(); // A função/método à ser executado na instanciação do objeto
        }
};

RedutoNERD rn; //Declarando globalmente o objeto 'rn', instância da classe RedutoNERD

//Só aqui começa o main
int main(){
    /*
    **Seu código aqui**
    */
    printf(" Reduto ");//Exemplo de texto
    return 0;
}

//Escopo da função/método desejada
void fazerAlgo(){
    /*
    **Aqui vai o código que se deseja executar na instanciação do objeto
    **antes do main conforme o tema do nosso tutorial
    */
    printf(" NERD ");//Exemplo de texto
}

Ao compilar este código, perceberemos que, o que está contido na função fazerAlgo() será executado antes de qualquer código contido no main(), isto é, a saída será a seguinte:


Vejam que, apesar da palavra "Reduto" vir no main(), ela aparece em segundo lugar na saída.


E por hoje é só pessoal!
Esperamos que este tutorial tenha sido proveitoso para vocês

Mandem suas dúvidas e sugestões para que possamos compartilhar com a nossa comunidade.


Fiquem atentos para mais dicas e tutoriais, aqui mesmo, no Reduto NERD!

Nenhum comentário:

Postar um comentário