web-dev-qa-db-fra.com

Appeler une fonction avant le principal

Duplicata possible:
Main () est-il vraiment le début d'un programme C++?

Est-il possible d'appeler ma fonction avant le démarrage du programme? Comment puis-je faire ce travail dans C++ ou C?

38
Nick

Vous pouvez avoir une variable globale ou un membre de classe static.

1) static membre de la classe

//BeforeMain.h
class BeforeMain
{
    static bool foo;
};

//BeforeMain.cpp
#include "BeforeMain.h"
bool BeforeMain::foo = foo();

2) variable globale

bool b = foo();
int main()
{
}

Notez ce lien - Miroir de http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.14 / alternative proposée - publié par Lundin .

44
Luchian Grigore

Dans C++, Il existe une méthode simple: utilisez le constructeur d'un objet global .

class StartUp
{
public:
   StartUp()
   { foo(); }
};

StartUp startup; // A global instance

int main()
{
    ...
}

En effet, l'objet global est construit avant le démarrage de main(). Comme Lundin l'a fait remarquer, faites attention au fiasco d'ordre d'initialisation statique .

28
gliderkite

Si vous utilisez les compilateurs gcc et g++, Cela peut être fait en utilisant __attribute__((constructor))

par exemple::
Dans gcc (c) ::

#include <stdio.h>

void beforeMain (void) __attribute__((constructor));

void beforeMain (void)
{
  printf ("\nbefore main\n");
}

int main ()
{
 printf ("\ninside main \n");
 return 0;
}

En g ++ (c ++) ::

#include <iostream>
using namespace std;
void beforeMain (void) __attribute__((constructor));

void beforeMain (void)
{
  cout<<"\nbefore main\n";
}

int main ()
{
  cout<<"\ninside main \n";
  return 0;
}
18
Eight

En C++, il est possible, par exemple.

static int dummy = (some_function(), 0);

int main() {}

En C, cela n'est pas autorisé car les initialiseurs pour les objets avec une durée de stockage statique doivent être des expressions constantes.

14
CB Bailey

Je vous suggère de vous référer à ce lien ..

http://bhushanverma.blogspot.in/2010/09/how-to-call-function-before-main-and.html

Pour le compilateur GCC sous Linux/Solaris:

#include

void my_ctor (void) __attribute__ ((constructor));
void my_dtor (void) __attribute__ ((destructor));

void
my_ctor (void)
{
printf ("hello before main()\n");
}

void
my_dtor (void)
{
printf ("bye after main()\n");
}

int
main (void)
{
printf ("hello\n");
return 0;
}

$gcc main.c
$./a.out
hello before main()
hello
bye after main()
2
kapilddit