Eventuali duplicati:
Is main() really start of a C++ program?Chiamare una funzione prima principale
è possibile chiamare la mia funzione prima della messa del programma? Come posso fare questo lavoro in C++
o C
?
Eventuali duplicati:
Is main() really start of a C++ program?Chiamare una funzione prima principale
è possibile chiamare la mia funzione prima della messa del programma? Come posso fare questo lavoro in C++
o C
?
È possibile avere una variabile globale o un membro della classe static
.
1) static
membro della classe
//BeforeMain.h
class BeforeMain
{
static bool foo;
};
//BeforeMain.cpp
#include "BeforeMain.h"
bool BeforeMain::foo = foo();
2) variabile globale
bool b = foo();
int main()
{
}
Nota questo link - Mirror of http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.14/proposed alternative - postato da Lundin.
Nota: il 'class' stesso è spurio qui, solo la creazione di un globale (qualunque cosa) è sufficiente. –
Basta essere consapevoli di [questo piccolo bug] (http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.14). La funzione chiamata non può dipendere da alcuna risorsa statica. Si dovrebbe scrivere come si scriverebbe una funzione di rientro. – Lundin
Credo che ciò sia tecnicamente scorretto. AFAIR la funzione non deve essere chiamata prima di 'main' e può essere ritardata fino a quando' b' è necessario. O forse era solo lo stato osservabile doveva essere lo stesso. – Pubby
In C++
esiste un metodo semplice: utilizzare il costruttore di un oggetto globale.
class StartUp
{
public:
StartUp()
{ foo(); }
};
StartUp startup; // A global instance
int main()
{
...
}
Questo perché l'oggetto globale viene creato prima dell'inizio di main()
. Come indicato da Lundin, prestare attenzione allo static initialization order fiasco.
Qualsiasi parte dell'inizializzazione, in realtà, compresi gli argomenti passati a un costruttore. –
Basta essere consapevoli di [questo piccolo bug] (http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.14). La funzione chiamata non può dipendere da alcuna risorsa statica. Si dovrebbe scrivere come si scriverebbe una funzione di rientro. – Lundin
In C++ è possibile, ad es.
static int dummy = (some_function(), 0);
int main() {}
In C questo non è consentito perché initializers per oggetti con durata di conservazione statica devono essere espressioni costanti.
Se utilizza gcc
e g++
compilatori allora questo può essere fatto utilizzando __attribute__((constructor))
es ::
In 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;
}
In 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;
}
Tranne che questo non è C né C++, sono estensioni GCC non standard. – Lundin
Ho avuto bisogno di chiamare una funzione 'void' prima di main recentemente, e ho provato ad adattare questa risposta, ma si è bloccata. Ho provato su cpp.sh e su code chef: lo stesso risultato in entrambi i casi. Se uso printf invece di cout, non c'è crash. Qualche idea del perché? – StoneThrow
Ti suggerisco di fare riferimento a questo link ..
http://bhushanverma.blogspot.in/2010/09/how-to-call-function-before-main-and.html
Per compilatore GCC su 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()
C'è una ragione convincente non si può semplicemente effettuare la chiamata subito dopo l'ingresso principale(), ma prima di qualsiasi dell'altra codice viene eseguito? Perché pre-main() è un requisito? – Omaha
perché non chiamare questa funzione all'inizio principale? –
Che cosa vuoi fare? Se spieghi ulteriormente il tuo problema reale, potresti ottenere suggerimenti sul design (piuttosto che sulla tecnica). Mentre puoi fare ciò che chiedi, vorrei ripensare un design che dipende da questo. –