2012-06-05 13 views
30

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?

+16

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

+3

perché non chiamare questa funzione all'inizio principale? –

+3

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. –

risposta

38

È 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.

+4

Nota: il 'class' stesso è spurio qui, solo la creazione di un globale (qualunque cosa) è sufficiente. –

+3

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

+0

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

25

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.

+0

Qualsiasi parte dell'inizializzazione, in realtà, compresi gli argomenti passati a un costruttore. –

+4

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

11

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.

+0

In C non c'è un modo? Solo in C++? – Nick

+0

@Nick: sì, per quanto ne so. –

+2

@CharlesBailey: Puoi farlo funzionare anche in C: 'static size_t dummy = sizeof (some_function(), 0);' – Nawaz

14

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; 
} 
+7

Tranne che questo non è C né C++, sono estensioni GCC non standard. – Lundin

+0

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

2

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() 
Problemi correlati