Mezcla extern y const


¿puedo mezclar extern y const, como extern const? En caso afirmativo, ¿el calificador const impone su reinado solo dentro del ámbito en el que se declara o debería coincidir exactamente con la declaración de la unidad traslacional en la que se declara? Es decir, ¿puedo declarar decir extern const int i; incluso cuando el verdadero i no es una const y viceversa?

Author: legends2k, 2010-02-03

4 answers

  • Sí, puedes usarlos juntos.
  • Y sí, debe coincidir exactamente con la declaración en la unidad de traducción en la que realmente se declara. A menos que, por supuesto, usted está participando en el Concurso de Programación en C Encubierto :-)

El patrón habitual es:

  • archivo.h:
    extern const int a_global_var;
  • archivo.c:
    #include "file.h"
    const int a_global_var = /* some const expression */;

Editar: Comentario de legends2k incorporado. Gracias.

 37
Author: edgar.holleis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-25 14:25:25

Puedes usarlos juntos. Pero debe ser consistente en su uso de const porque cuando C++ hace la decoración de nombres, const se incluye en la información de tipo que se utiliza para decorar los nombres de los símbolos. así que extern const int i se referirá a una variable diferente de extern int i

A menos que utilice extern "C" {}. C la decoración del nombre no presta atención a const.

 5
Author: John Knoeller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-03 09:39:14

Puedes usarlos juntos y puedes hacer todo tipo de cosas que ignoran la palabra clave const, porque eso es todo lo que es; una palabra clave. Le dice al compilador que no va a cambiar una variable, lo que a su vez le permite al compilador hacer algunas optomizaciones útiles y le impide cambiar cosas que no quería.

Possibility.com tiene un artículo decente con algo más de fondo.

 1
Author: Jon Cage,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-03 09:38:37

Sí, puede usarlos juntos.

Si declara "extern const int i", entonces i es const sobre su alcance completo. Es imposible redefinirlo como no-const. Por supuesto, puede omitir la bandera const desechándola (usando const_cast).

 0
Author: Dimitri C.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-03 09:38:48