2010-03-25 33 views
5

Questo è dal <iostream>:Come funziona extern in C++?

namespace std 
{ 
    extern istream cin;  ///< Linked to standard input 
    extern ostream cout; 
... 

Sembra utilizzando extern i tipi di dati definiti in altri spazi dei nomi sarà solo a disposizione?

risposta

2

extern viene utilizzato per fare riferimento a una variabile definita in una diversa unità di compilazione (per ora, è possibile pensare a un'unità di compilazione come un file .cpp). Le dichiarazioni nell'esempio dichiarano anziché definisconocin e cout. Sta dicendo al compilatore che la definizione di questi oggetti si trova in un'altra unità di compilazione (dove sono non dichiarata come extern).

+0

Ma non trovo da nessuna parte che definisca 'cin', solo' istream' è definito in '' – symfony

+0

'cin' è un oggetto di tipo' istream'. 'istream' è la definizione della classe (in questo caso, template class). 'cin' è un'istanza della classe' istream'. La "definizione" a cui mi riferisco nella mia risposta è la definizione di 'cin', non di' istream'. È necessario cercare il significato di * definizione * rispetto a * declarazione *. Le dichiarazioni nei tuoi esempi sono * dichiarazioni *. –

+0

La * definizione * della variabile 'cin' è molto probabile in una libreria run-time. Non lo troverai nei file di intestazione della libreria standard. –

2

No, questo è un modo esplicito per dire cin e cout sono dichiarati senza effettivamente definirli.

7

extern significa "queste variabili sono definite in qualche altra unità di compilazione (cpp o un file lib)"

In questo caso, si #include <iostream> nel file cpp, sia perché cin e cout sono dichiarate come extern , il compilatore ti permetterà di usarli senza lamentarti. Quindi, quando viene eseguito il linker, cerca tutte le variabili extern e le ordina completamente.

+0

Significa che 'istream' o' cin' è definito in qualche altra unità nel caso di 'extern istream cin; '? – symfony

+2

Significa che 'cin' è. Questa non è la stessa cosa della * definizione di classe *, che in questo caso è in 'iostream'. La * definizione della classe * deve sempre essere disponibile in una unità di compilazione per utilizzare oggetti di quel tipo di classe (ecco perché le definizioni di classe vengono inserite nei file * header *). –

+0

@STingRaySC, puoi elaborare un po '? Sono molto confuso .. – symfony