es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Dado que strhash_ct es una función constexpr, significa que puede ser evaluada en tiempo de compilación. Por lo tanto, podemos asegurarnos de que el valor de seed 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 en a.h de la siguiente manera:

    constexpr uint64_t seed = [] constexpr {
        // Evaluating strhash_ct at compile time
        return strhash_ct(__TIME__);
    }();
    

    Esto utiliza una función lambda que se define como constexpr, y que se invoca inmediatamente para evaluar strhash_ct(__TIME__). Esto asegura que seed 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 y c deberían ser iguales.

    Otra forma de lograrlo es usando la palabra clave inline para seed:

    inline constexpr uint64_t seed = strhash_ct(__TIME__);
    

    La palabra clave inline asegura que la variable se defina en cada unidad de traducción donde se use, pero como también es constexpr, 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.

Comments are closed.