2016-06-03 32 views
7

Quando aggiungo questo codice in cpp esistente con uno dei miei implementazione della classeNessuna inizializzazione globale variabile

#include <iostream> 

struct TestStruct{ 
    TestStruct(int i) 
    { 
     std::cerr << i << std::endl; 
     x = i; 
    } 
    int x; 
}; 

TestStruct t(8); 

Esso stampa 8 prima main eseguito.

Ma quando ho creato il nuovo file vuoto test.cpp e inserito lo stesso codice, non è stato stampato nulla. Ho controllato che questa cpp fosse compilata e collegata. Tutti i file cpp sono compilati come lib statico e quindi questa lib con main.o collegato nel file eseguibile. Io uso g ++ 5.3 l'unica opzione è -std=C++14.

Perché nel secondo caso l'inizializzazione della variabile globale è mancata?

+0

Correggi i tuoi errori di battitura e qual è la differenza tra il tuo caso 1 e il caso 2? –

+0

Il primo caso nel cpp con altro codice grande e il secondo caso nel nuovo file –

risposta

8

È stata aggiunta la classe TestStruct come modulo separato in una libreria statica e collegata al file eseguibile.

L'intero scopo dell'utilizzo di una libreria statica è che solo i moduli con simboli, classi o altre risorse a cui fa riferimento l'eseguibile a cui si sta collegando - vengono collegati nell'eseguibile. I moduli in una libreria statica che non hanno simboli a cui si fa riferimento, direttamente o indirettamente, dal file eseguibile principale non vengono collegati nell'eseguibile principale. Ecco cos'è una libreria statica.

Poiché il file eseguibile non ha riferimenti espliciti alla classe TestStruct, il modulo non è stato collegato al file eseguibile e non è diventato parte dell'eseguibile finale.

Ma quando hai aggiunto la classe TestStruct in un modulo esistente che il tuo eseguibile già fa riferimento e utilizza (direttamente o indirettamente), allora questa classe, insieme a tutti gli altri simboli e classi dell'altro modulo, viene collegata al tuo eseguibile e diventare una parte dell'esecutivo finale.

Poiché il tuo eseguibile fa riferimento a qualche simbolo o altre risorse in quell'altro modulo, tutto in quel modulo, inclusa la classe di test, viene collegato nell'eseguibile.

+0

Le classi non esistono nei file oggetto. Ciò che questa risposta dice sulla "classe' TestStruct' si applica in realtà alla variabile 't', giusto? – Angew

+0

Quello, e al costruttore della classe. –

+0

Certo, ma la presenza del costruttore stesso non è realmente l'argomento della domanda, io direbbe: è la sua chiamata quando si crea 't'. – Angew