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 contador del bucle for genera una advertencia de variable no utilizada.

Mi programa tiene un algoritmo iterativo con un bucle for que he escrito como:

for (auto i : std::views::iota(0u, max_iter)) { ... }

Realmente me gusta el hecho de que se pueda escribir de esta manera, incluso si los archivos de encabezado necesarios son enormes. Sin embargo, cuando lo compilo, recibo una advertencia de que i es una variable no utilizada.

Cuando escribo el bucle for de la manera tradicional, no hay ninguna advertencia:

for (unsigned i=0; i < max_iter; i++) { ... }

He probado esto con un programa mínimo llamado for-loop.cpp:

#include <ranges>
#include <numeric>
#include <iostream>

int main() {
    char str[13] = "this is good";

    for (auto i : std::views::iota(0u, 2u)) {
        std::cout << str << "\n";
    }

    for (unsigned it=0; it<2; it++ ) {
        std::cout << str << "\n";
    }

    return 0;
}

Y efectivamente, al compilarlo con g++ -Wall --std=c++20 -o for-loop for-loop.cpp, se muestra una advertencia para el primer bucle y no para el segundo.

¿Me estoy perdiendo algo aquí? Prefiero la primera notación, y sé que puedo detener las advertencias con -Wno-unused-variable; me gustaría tener esas advertencias, es solo que realmente estoy usando el contador del bucle for.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    La advertencia sobre la variable i no utilizada se debe al hecho de que en realidad no estás utilizando el valor de i dentro del cuerpo del bucle. En tu ejemplo, simplemente estás imprimiendo str en la consola y no estás haciendo nada con el valor de i.

    Una forma de evitar esta advertencia mientras sigues utilizando la primera notación sería marcar explícitamente i como no utilizado utilizando el atributo [[maybe_unused]], de la siguiente manera:

    for ( [[maybe_unused]] auto i : std::views::iota( 0u, max_iter ) ) {
        ...
    }
    

    Esto le indica al compilador que eres consciente de que la variable no está siendo utilizada y que no emita una advertencia al respecto.

Comments are closed.