2010-06-21 9 views
5

Esiste un meccanismo o un trucco per eseguire una funzione quando viene caricato un programma?È possibile eseguire una funzione sull'inizializzazione in c?

Quello che sto cercando di ottenere ...

void foo(void) 
{ 
} 

register_function(foo); 

ma ovviamente register_function non verrà eseguito.

così un trucco in C++ è quello di utilizzare l'inizializzazione di fare una corsa funzione di

qualcosa come

int throwaway = register_function(foo); 

ma che non funziona in C. Quindi sto cercando un modo per aggirare questo utilizzando C standard (niente di piattaforma/compilatore specifico)

+4

Cosa c'è di sbagliato con 'main()'? –

+0

perché voglio un numero di file .c, e non voglio che le persone debbano ricordare di andare a mettere la funzione di registro in main .... –

risposta

14

Se si sta utilizzando GCC, si può fare questo con un attributo constructor funzione, per es:

#include <stdio.h> 

void foo() __attribute__((constructor)); 

void foo() { 
    printf("Hello, world!\n"); 
} 

int main() { return 0; } 

Non c'è un modo portatile per farlo in C, tuttavia.

Se non ti dispiace fare scherzi con il tuo sistema di build, però, hai più opzioni. Ad esempio, è possibile:

#define CONSTRUCTOR_METHOD(methodname) /* null definition */ 

CONSTRUCTOR_METHOD(foo) 

Ora scrivere uno script di build per la ricerca di istanze di CONSTRUCTOR_METHOD, e incollare una sequenza di chiamate a loro in una funzione in un file .c generato. Richiama la funzione generata all'inizio di main().

+0

nice, è quello che voglio, ma speravo in qualcosa di più standard C –

+1

non sta facendo C++ qui, è banalmente facile in C++ –

+0

La soluzione di bdonlan non usa C++. Leggi di nuovo su di esso; è semplicemente specifico del GCC. –

0

Non esiste un metodo standard per farlo anche se gcc fornisce un attributo constructor per le funzioni.

Il modo consueto di garantire che alcune pre-impostazioni siano state eseguite (a parte una semplice inizializzazione delle variabili su un valore di tempo di compilazione) è quello di assicurarsi che tutte le funzioni richiedano tale pre-installazione. In altre parole, qualcosa del tipo:

static int initialized = 0; 
static int x; 

int returnX (void) { 
    if (!initialized) { 
     x = complicatedFunction(); 
     initialized = 1; 
    } 
    return x; 
} 

Questa operazione viene eseguita in una libreria separata poiché isola dall'implementazione.

+0

sì .... comunque nel mio caso voglio una pre-installazione in cui una funzione verrà registrata e memorizzata in un elenco ..... quindi in seguito qualcosa passerà attraverso quell'elenco che esegue le funzioni registrate. Attualmente ciò significa che ciascuna funzione deve essere esplicitamente aggiunta in qualche posizione centrale. Volevo trovare un trucco in cui la funzione può essere registrata nel punto di dichiarazione –

3

C standard non supporta tale operazione. Se non si desidera utilizzare caratteristiche specifiche del compilatore per fare ciò, la prossima soluzione migliore potrebbe essere quella di creare un flag statico globale inizializzato su false. Quindi, ogni volta che qualcuno richiama una delle tue operazioni che richiede la registrazione del puntatore alla funzione, controlli quel flag. Se è falso, registri la funzione, quindi imposta il flag su true. Le chiamate successive quindi non dovranno eseguire la registrazione. Questo è simile all'istanziazione lazy utilizzata nel modello di progettazione di OO Singleton.

Problemi correlati