long c++ c global-variables extern kernighan-and-ritchie

c++ - extern long in c



“Extern” dentro de una función? (3)

Bueno, al leer el libro "un poco viejo" ("El lenguaje de programación C", segunda edición, de Dennis Ritchie), me topé con lo siguiente:

Una variable externa debe definirse, exactamente una vez, fuera de cualquier función; esto deja a un lado el almacenamiento para ello. La variable también debe ser declarada en cada función que quiera acceder a ella.

y yo estaba como - ¿qué?

"La variable también debe ser declarada en cada función que quiera acceder a ella". Entonces, me sorprendió una vez más:

int max; /* ... */ int main() { extern int max; /* ... */ }

Y uno más, ¿qué?

Por lo que sé (obviamente, no es mucho y no es suficiente), extern tiene sentido solo cuando define una variable global en algún lugar y desea acceder a ella a través de otro archivo (no volver a definirla).

Asi que:

  • ¿Cuál es el punto de este extern int max dentro de la función main o cualquier otra función?
  • ¿El estándar realmente dice que esto es un deber (que debo declarar, para este ejemplo, este máximo en cada función, que lo usará?)
  • ¿Es esto lo mismo para C ++ (por eso coloqué la etiqueta de C ++)? Esta es la primera vez que veo algo como esto.

Nota: esto no es lo mismo. ¿Cuál es el uso de declarar una variable estática como extern dentro de una función?


Lo extern es el enlace . Significa que este nombre, max , está vinculado a otras apariciones del nombre, posiblemente en otros archivos. (Es decir, cuando los módulos de objetos se vinculan entre sí para formar un ejecutable, todas las referencias vinculadas a este nombre se harán al mismo objeto).

El alcance de esta declaración es el resto del cuerpo de la función en la que se encuentra. Eso significa que otras funciones en este archivo no ven el nombre declarado por esta declaración (a menos que lo declaren ellos mismos).

El alcance y la vinculación son cosas diferentes.


Tu post me ha sorprendido. No tenía ningún recuerdo de eso y leí K&R hace mucho tiempo. Solo tengo la primera edición aquí y está ahí también. Sin embargo, eso no es todo lo que dice. Desde la primera edición:

La variable también debe ser declarada en cada función que quiera acceder a ella; Esto se puede hacer mediante una declaración externa explícita o implícitamente por contexto.

Tenga en cuenta la "implícitamente por contexto". Más adelante en el texto:

... si la definición externa de una variable se produce en el archivo fuente antes de su uso en una función particular, entonces no hay necesidad de una declaración externa en la función. Las declaraciones externas en main, ... son por lo tanto redundantes. De hecho, la práctica común es colocar definiciones de todas las variables externas al comienzo del archivo fuente y luego omitir todas las declaraciones externas.

Por lo tanto, esto significa que hacer visible la variable externa se puede hacer dentro de la función solo para esa función, o se puede hacer fuera de cualquier función para todas las funciones que siguen en el archivo fuente. Creo que este es el único lugar en el libro donde se realiza dentro de la función, más tarde utiliza el método familiar una vez para el enfoque de archivo.


extern int max inside main o function le dice al compilador "No soy una variable local dentro de main o function, soy la variable global definida en otro lugar" .

Si el global se declara en el mismo archivo, no es útil. En un archivo diferente, sí, pero no en cada función, simplemente declare una vez en el archivo principal de la fuente que usa esta variable global. Esto es lo mismo en c++ .