online ejemplos descargar definicion caracteristicas c++

ejemplos - Definir constante global en C++



c++ online (8)

Quiero definir una constante en C ++ para que sea visible en varios archivos fuente. Puedo imaginar las siguientes formas de definirlo en un archivo de encabezado:

  1. #define GLOBAL_CONST_VAR 0xFF
  2. int GLOBAL_CONST_VAR = 0xFF;
  3. Algunas funciones retienen el valor (por ejemplo, int get_GLOBAL_CONST_VAR() )
  4. enum { GLOBAL_CONST_VAR = 0xFF; }
  5. const int GLOBAL_CONST_VAR = 0xFF;
  6. extern const int GLOBAL_CONST_VAR; y en un archivo fuente const int GLOBAL_CONST_VAR = 0xFF;

Opción (1): definitivamente no es la opción que le gustaría usar

Opción (2): definición de la instancia de la variable en cada archivo de objeto utilizando el archivo de encabezado

Opción (3): la OMI está matando en la mayoría de los casos

Opción (4): en muchos casos tal vez no sea buena ya que enum no tiene un tipo concreto (C ++ 0X agregará la posibilidad de definir el tipo)

Entonces, en la mayoría de los casos, tengo que elegir entre (5) y (6). Mis preguntas:

  1. ¿Qué prefieres (5) o (6)?
  2. ¿Por qué (5) está bien, mientras que (2) no?

(5) dice exactamente lo que quieres decir. Además, permite que el compilador lo optimice la mayor parte del tiempo. (6) por otro lado, no permitirá que el compilador lo optimice porque el compilador no sabe si lo va a cambiar eventualmente o no.


(5) es "mejor" que (6) porque define GLOBAL_CONST_VAR como una expresión constante integral (ICE) en todas las unidades de traducción. Por ejemplo, podrá usarlo como tamaño de matriz y como etiqueta de caso en todas las unidades de traducción. En el caso de (6) GLOBAL_CONST_VAR será un ICE solo en esa unidad de traducción donde se define y solo después del punto de definición. En otras unidades de traducción, no funcionará como ICE.

Sin embargo, tenga en cuenta que (5) proporciona un enlace interno GLOBAL_CONST_VAR , lo que significa que la "identidad de dirección" de GLOBAL_CONST_VAR será diferente en cada unidad de traducción, es decir, &GLOBAL_CONST_VAR le dará un valor de puntero diferente en cada unidad de traducción. En la mayoría de los casos, esto no importa, pero si necesita un objeto constante que tenga una "identidad de dirección" global coherente, entonces tendría que ir con (6), sacrificando el ICE-ness de la constante en el proceso.

Además, cuando el ICE-ness de la constante no es un problema (no es un tipo integral) y el tamaño del tipo aumenta (no es un tipo escalar), entonces (6) generalmente se convierte en un mejor enfoque que (5).

(2) no está bien porque GLOBAL_CONST_VAR en (2) tiene un enlace externo por defecto. Si lo coloca en el archivo de encabezado, generalmente terminará con varias definiciones de GLOBAL_CONST_VAR , que es un error. const objetos const en C ++ tienen un enlace interno por defecto, por lo que (5) funciona (y por eso, como dije antes, obtienes un GLOBAL_CONST_VAR separado e independiente en cada unidad de traducción).


Definitivamente vaya con la opción 5 - es segura y permite que el compilador optimice (no tome la dirección de esa variable :) Además, si está en un encabezado, péguela en un espacio de nombres para evitar contaminar el alcance global:

// header.hpp namespace constants { const int GLOBAL_CONST_VAR = 0xFF; // ... other related constants } // namespace constants // source.cpp - use it #include <header.hpp> int value = constants::GLOBAL_CONST_VAR;


Depende de tus requisitos. (5) es el mejor para un uso normal, pero a menudo resulta en un espacio de almacenamiento constante en cada archivo de objeto. (6) puede evitar esto en situaciones donde es importante.

(4) también es una opción decente si su prioridad es garantizar que nunca se asigne espacio de almacenamiento, pero solo funciona para constantes integrales, por supuesto.


Para responder a tu segunda pregunta:

(2) es ilegal porque viola la regla de una sola definición. Define GLOBAL_CONST_VAR en cada archivo donde está incluido, es decir, más de una vez. (5) es legal porque no está sujeto a la Regla de una sola definición. Cada GLOBAL_CONST_VAR es una definición separada, local a ese archivo donde está incluido. Todas esas definiciones comparten el mismo nombre y valor, por supuesto, pero sus direcciones pueden diferir.


Si va a ser una constante, entonces debe marcarla como una constante, es por eso que 2 es malo en mi opinión.

El compilador puede usar la naturaleza constante del valor para expandir algunas de las matemáticas, y de hecho otras operaciones que usan el valor.

La elección entre 5 y 6 - hmm; 5 simplemente se siente mejor para mí.

En 6) el valor se separa innecesariamente de su declaración.

Normalmente tendría uno o más de estos encabezados que solo definen las constantes, etc. dentro de ellos, y luego no hay otras cosas ''inteligentes'': agradables encabezados livianos que se pueden incluir fácilmente en cualquier lugar.


#define GLOBAL_CONST_VAR 0xFF // this is C code not C++ int GLOBAL_CONST_VAR = 0xFF; // it is not constant and maybe not compilled Some function returing the value (e.g. int get_LOBAL_CONST_VAR()) // maybe but exists better desision enum { LOBAL_CONST_VAR = 0xFF; } // not needed, endeed, for only one constant (enum elms is a simple int, but with secial enumeration) const int GLOBAL_CONST_VAR = 0xFF; // it is the best extern const int GLOBAL_CONST_VAR; //some compiller doesn''t understand this


const int GLOBAL_CONST_VAR = 0xFF;

porque es una constante!