El valor constexpr definido en el archivo de encabezado presenta un problema de caso. ¿Cómo solucionarlo?
a.h
constexpr uint64_t seed = strhash_ct(TIME);
//seed en a.h debe ser constexpr, ya que quiero ponerlo en una plantilla, como esta:
HashJic::ensure_compile_time<seed>::value
b.cpp
<h1>incluye "a.h"</h1>
<p>uint64_t b = seed;
<code>
c.cpp
</code></p>
<h1>incluye "a.h"</h1>
<p>uint64_t c = seed;
En este caso, b != c
¿Cómo puedo obtener el mismo valor?
información adicional 1:strhash_ct es una función constexpr
davy.ai
Dado que
strhash_ct
es una funciónconstexpr
, significa que puede ser evaluada en tiempo de compilación. Por lo tanto, podemos asegurarnos de que el valor deseed
sea el mismo en todas las unidades de traducción asegurándonos de evaluarlo en tiempo de compilación.Una forma de lograr esto es cambiar la declaración de
seed
ena.h
de la siguiente manera:Esto utiliza una función lambda que se define como
constexpr
, y que se invoca inmediatamente para evaluarstrhash_ct(__TIME__)
. Esto asegura queseed
se inicialice en tiempo de compilación y tenga el mismo valor en todas las unidades de traducción.Con este cambio, los valores de
b
yc
deberían ser iguales.Otra forma de lograrlo es usando la palabra clave
inline
paraseed
:La palabra clave
inline
asegura que la variable se defina en cada unidad de traducción donde se use, pero como también esconstexpr
, el compilador garantizará que el valor sea el mismo en todas las definiciones. Sin embargo, note que este enfoque puede aumentar el tamaño del programa compilado.