lenguaje ejemplos dev define declarar constint constantes como calificador c++ c const one-definition-rule

c++ - ejemplos - constint



¿Por qué se permite la definición múltiple de una variable global const en C++ y no en C? (6)

La definición múltiple de una variable global no está permitida en C o C ++ debido a la Regla de una definición. Sin embargo, en C ++ se puede definir una variable global constante en varias unidades de compilación sin error. Esto no es lo mismo que en C.

¿Por qué C ++ permite esto mientras que C no? ¿Por qué el uso y el comportamiento de una constante global difieren de una global no constante de esta manera en C ++ en comparación con C? ¿Qué está pasando bajo las coberturas con C ++ y C con respecto a const?

Por ejemplo, esto está permitido en C ++, pero incorrecto en C:

// Foo.cpp const int Foo = 99; // Main.cpp const int Foo = 99; int main() { cout << Foo << endl; return 0; }

Y esto está bien con C, pero mal con C ++:

// Foo.cpp const int Foo = 99; // Main.cpp extern const int Foo; int main() { cout << Foo << endl; return 0; }


Básicamente, en C ++, const, las variables no locales son expresiones constantes genuinas, o constexpr. Esto permite muchas cosas, como TMP.

const int five = 5; int main() { int x[five]; std::array<int, five> arr; }

En C, son solo una variable que no puede ser modificada. Es decir,

const int five = 5; int main() { int x[five]; // Technically, this is a variable length array }

Es bastante equivalente a

int five = 5; int main() { int x[five]; }

Efectivamente, C ++ promueve algunos tipos de variable const a una nueva categoría, constexpr , mientras que en C, esto no existe y son solo variables que resultan no modificables.


Creo que está pidiendo la razón y no la regla de lenguaje específica que lo permite.

La razón de esto es que hace que las variables const sean mucho más fáciles de usar. Da un reemplazo escrito para un uso común de #define .

En lugar de #define MAX_COUNT 211 puede usar const int max_count = 211; exactamente de la misma manera, por ejemplo, un archivo de encabezado compartido, sin tener que preocuparse por dónde colocar la definición.

No puede cambiar legalmente el valor de un objeto const por lo que no hay una diferencia visible entre tener un objeto y varios objetos con el mismo valor.

Como puede poner una definición de un objeto const en un archivo de encabezado, hace que el compilador utilice el valor directamente en la etapa de compilación, sin que dichas optimizaciones deban ser retrasadas para una reparación de tiempo de enlace.


Mi solución lo estaba declarando como:

static classfoo foo;

funcionó en mi situación



¿Por qué los ingleses deletrean el COLOR, mientras que los americanos lo escriben con el COLOR?

Son 2 idiomas diferentes de la misma base, pero no tienen las mismas reglas.

C y C ++ son lo mismo. Si no fueran diferentes, ambos serían llamados lo mismo.


// Foo.cpp const int Foo = 99; // Main.cpp const int Foo = 99;

const variable const en el ámbito del espacio de nombres tiene un enlace interno . Entonces son básicamente dos variables diferentes. No hay redefinición.

Del comentario de @ David, 3.5 / 3 [basic.link]:

Un nombre que tenga un ámbito de espacio de nombres (3.3.5) tiene un enlace interno si es el nombre de
- un objeto, referencia, función o plantilla de función que se declara explícitamente como estática o,
- un objeto o referencia que se declara explícitamente const y no se declara explícitamente extern ni se declaró previamente que tiene enlace externo ; o
- un miembro de datos de una unión anónima.

En el segundo caso, deberías estar haciendo esto (forma correcta):

//Foo.h extern const int Foo; //use extern here to make it have external linkage! // Foo.cpp #include "Foo.h" const int Foo = 99; //actual definition goes here // Main.cpp #include "Foo.h" int main() { cout << Foo << endl; }