2012-01-03 11 views
20

Nei linguaggi orientati agli oggetti (C++) è possibile eseguire il codice prima dello main() utilizzando un oggetto globale o un oggetto statico di classe e chiedere ai costruttori di eseguire il codice desiderato.Eseguendo codice prima principale()

C'è un modo per farlo in C? Non ho alcun problema specifico che sto cercando di risolvere, sono solo curioso. Una cosa che potrebbe essere utile è inizializzare automaticamente una libreria.

+0

http://stackoverflow.com/questions/949890/how-can-i-forma-pre-main-initialization-in-cc-with-avr-gcc – stacker

+0

@stacker - La domanda a cui fai riferimento è specifica per Ambiente Arduino. Ad ogni modo, le risposte potrebbero essere utili. – mouviciel

risposta

10

Ci sono modi per utilizzare __attribute__ ma quelli sono molto specifici per il compilatore e il codice che viene scritto utilizzando questi sono non davvero portatile. D'altra parte, il linguaggio C non fornisce alcun modulo/libreria di avvio.

In C, logicamente main() è la prima funzione richiamata dal sistema operativo. Ma prima di chiamare main(), il sistema operativo chiama un'altra funzione denominata modulo start-up per configurare varie variabili di ambiente, inizializzare variabili non inizializzate, creare uno stack frame (record di attivazione) e inizializzare il puntatore dello stack all'inizio dell'area dello stack e altro attività che devono essere eseguite prima di chiamare main().

Dire se si sta scrivendo il codice per i sistemi incorporati in cui non esiste un SO minimo o minimo per eseguire il lavoro sopra citato, è necessario esplorare queste opzioni che dipendono dal compilatore. Oltre ai compilatori GCC, Turbo-C e Microsoft C fornisce funzionalità per aggiungere codice in una particolare macchina hardware (ad esempio macchine 8086).

IOW, i moduli di avvio non sono pensati per i programmatori.

+0

Errore, 'main' non è la prima funzione richiamata dal sistema operativo. Hai sentito parlare di [crt0] (https://en.wikipedia.org/wiki/Crt0)? '_start' è sempre chiamato prima di' main', e in Windows, 'WinMain' viene chiamato anche prima di' main'. –

0

È possibile inizializzare le variabili globali ma non chiamare le funzioni all'interno di queste inizializzazioni.

1

No, non è possibile farlo in C, e direi che non si può davvero ottenere quel "codice da eseguire prima dello main()" anche in C++. Sì, potrebbe apparire prima dello main() nello script, ma main() è il punto in cui il programma viene effettivamente avviato.

Ora è possibile inizializzare i valori, ciò è possibile. Puoi anche avere variabili con uno stato preimpostato, ma non è la stessa cosa.

+3

Per 3.6.2/3 ("deve succedere prima del primo utilizzo di qualsiasi funzione o oggetto definito nella stessa unità di traduzione dell'oggetto da inizializzare"), gli oggetti con scope namespace nella stessa TU di 'main' devono essere inizializzato prima della prima istruzione di 'main', poiché' main' * è * una funzione nella stessa TU. Lo standard non si preoccupa se c'è una chiamata a quel codice init dall'interno del corpo della funzione di 'main', prima di ogni altra istruzione, o se c'è qualche altra funzione per eseguire init, che le chiamate di implementazione prima chiamano main. –

4

Con gcc, è possibile farlo utilizzando l'attributo della funzione di costruzione, ad es.

__attribute__ ((__constructor__)) 
void foo(void) { 
     ... 
} 

Questo invocherà foo prima di main.

Nota: Probabilmente questo non è portatile per altri compilatori.

13

È possibile farlo con __attribute__ ((constructor)). Ho testato il seguente esempio con entrambi gli apparecchi gcc e clang. Detto questo, è non parte della lingua.

#include <stdio.h> 

void __attribute__ ((constructor)) premain() 
{ 
    printf("premain()\n"); 
} 

int main(int argc, char *argv[]) 
{ 
    printf("main()\n"); 
    return 0; 
} 

esegue le seguenti operazioni:

$ ./test 
premain() 
main() 
0

Non è in alcun modo conforme agli standard, ma si dovrebbe scavare dentro a ciò che realmente accade quando il sistema operativo carica l'immagine binaria e chiama la funzione principale dell'applicazione !

0

Esistono modi portatili per specificare le funzioni che possono essere eseguite dopo che "main" è stato eseguito.

  1. atexit()

  2. at_quick_exit()

Inoltre, seguire this collegamento e sui vari tipi di inizializzazione in C++ - che può essere utile per voi di eseguire il codice prima di main() viene chiamato .

+0

Inoltre, segui questo [collegamento] (http://en.cppreference.com/w/cpp/language/initialization) e sui vari tipi di inizializzazione in C++, che potrebbero essere utili per eseguire codice prima che main() sia chiamato. –

+0

La domanda era di chiamare il codice prima di main in C. Non chiamare codice dopo main, o C++. –

Problemi correlati