2010-03-25 13 views
5

Esto es de la <iostream>:¿Cómo funciona extern en C++?

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

Parece utilizando extern los tipos de datos definidos en otros espacios de nombres sólo va a estar disponible?

Respuesta

2

extern se utiliza para hacer referencia a una variable definida en una unidad de compilación diferente (por ahora, puede pensar en una unidad de compilación como un archivo .cpp). Las instrucciones en su ejemplo declaran en lugar de definencin y cout. Le está diciendo al compilador que la definición de estos objetos se encuentra en otra unidad de compilación (donde están no declarados como extern).

+0

Pero no encuentro ningún lugar que defina 'cin', solo' istream' se define en '' – symfony

+0

'cin' es un objeto de tipo' istream'. 'istream' es la definición de clase (en este caso, clase de plantilla). 'cin' es una instancia de la clase' istream'. La "definición" a la que me refiero en mi respuesta es la definición de 'cin', no' istream'. Necesita buscar el significado de * definition * vs. * declaraion *. Las declaraciones en sus ejemplos son * declaraciones *. –

+0

La * definición * de la variable 'cin' es más probable en una biblioteca en tiempo de ejecución. No lo encontrará en los archivos de encabezado de biblioteca estándar. –

2

No, esta es una forma explícita de decir que cin y cout se declaran sin definirlos realmente.

7

extern significa "estas variables se definen de alguna otra unidad de compilación (.cpp o un archivo .lib)"

En este caso, #include <iostream> en su archivo .cpp y porque cin y cout se declaran como extern , el compilador te permitirá usarlos sin quejarte. Luego, cuando se ejecuta el enlazador, busca todas las variables extern y lo resuelve todo.

+0

¿Significa 'istream' o' cin' se define en alguna otra unidad en el caso de 'extern istream cin; '? – symfony

+2

Significa 'cin' es. Esto no es lo mismo que * la definición de clase *, que en este caso, está en 'iostream'. La * definición de clase * siempre debe estar disponible en una unidad de compilación para usar objetos de ese tipo de clase (esta es la razón por la que las definiciones de clases se colocan en archivos * header *). –

+0

@STingRaySC, ¿pueden explicar un poco? Estoy confundido. – symfony