¿Puedo acceder a variables estáticas dentro de una función desde el exterior?

3 minutos de lectura

Avatar de usuario de Robin Hsu
petirrojo

C/C++: ¿Puedo acceder a variables estáticas dentro de una función desde el exterior? Por ejemplo:

#include <iostream>
using namespace std;

void f()
{
    static int count = 3;
    cout << count << endl;
}

int main(int argc, char** argv)
{
    f::count = 5;   // apparently this is an invalid syntax.
    f();

    return 0;
}

avatar de usuario de rici
rico

No, no se puede, ni en C ni en C++.

Si desea mantener el estado asociado con una función, defina una clase con el estado apropiado y una función miembro. (En C ++. También ha etiquetado la pregunta con C; la misma técnica funciona, pero debe hacer todo el trabajo preliminar usted mismo).

Aunque tienen sus usos, la mayoría de las veces los locales estáticos no constantes son una mala idea. Hacen que su función no sea segura para subprocesos y, a menudo, la hacen “llamar una vez”.

  • Las constantes estáticas son seguras para subprocesos y, a menudo, son una mejor solución que los miembros de datos estáticos si solo una función los usa.

    – Glenn Teitelbaum

    4 de junio de 2015 a las 5:59

Avatar de usuario de Glenn Teitelbaum
Glenn Teitelbaum

No se puede acceder a las variables dentro del alcance de una función externamente por su nombre, pero puede devolver un puntero o una referencia a ellas.

  • Puedes. Pero diremos que devolver el puntero a la variable estática de la función sería extremadamente confuso y una mala práctica de código. Si lo necesitas hazlo una variable global…

    – Vit Bernatik

    2 mayo 2018 a las 16:17

  • @VitBernatik ¿Por qué es esto malo?

    – Ravi Raj

    19 de noviembre de 2020 a las 14:26

  • Simplemente lea esto recomendado en la guía de C++ de Strousoup. Es mejor que los globales.

    – Glenn Teitelbaum

    27 sep 2021 a las 16:02

Avatar de usuario de Tarc
alquitrán

Como se dijo en otras respuestas, no existe una sintaxis especial para acceder a las variables locales de forma externa, pero puede lograrlo devolviendo una referencia a la variable, por ejemplo:

#include <iostream>
using namespace std;
int& f(void)
{
     static int count = 3;
     cout << count << endl;

     return count;
}

int main()
{
    int &count = f(); // prints 3
    count = 5;
    f();              // prints 5
    return 0;
}

En C++ 11 también puede acceder a sus variables estáticas locales desde una lambda devuelta:

#include <iostream>
#include <functional>

using namespace std;

std::function<void()> fl()
{
    static int count = 3;
    cout << count << endl;

    return []{count=5;};
}

int main()
{
    auto l = fl();  // prints 3
    l();
    fl();           // prints 5
    return 0;
}

No, el conteo variable solo está disponible dentro de la función y no tiene vinculación. Sin embargo, la vida útil de esta variable sería el alcance del archivo, como sugiere C++ Primer

Cada variable estática local se inicializa antes de que la ejecución pase por primera vez a través de la definición del objeto. La estática local no se destruye cuando finaliza una función; se destruyen cuando finaliza el programa.

Una variable estática tiene un alcance dentro del bloque, pero tiene una vida útil a lo largo del programa, por lo que no puede acceder a la variable de país, intente devolver un puntero desde la función.

Avatar de usuario de No-Bugs Hare
Liebre sin bichos

No, pero (obviamente) siempre puede moverlo fuera de la función para que sea accesible para todo el archivo; excepto por el espacio de nombres abarrotado a nivel de archivo (que en mi humilde opinión no es gran cosa), no veo muchas desventajas para tal movimiento (y también será más explícito y obvio: en lugar de acceder a algo supuestamente privado, dejarás claro que esto es para compartir).

Dicho esto, todos los tipos de datos estáticos no constantes deben usarse con extremo cuidado, y una regla general (es decir, hasta que se demuestre lo contrario) es que son una mala idea.

avatar de usuario de fatihk
fatihk

En los lenguajes C y C++, el ámbito en el que se define la variable es importante. No puede alcanzar una variable desde los ámbitos superiores.

Para este propósito, puede usar estructuras o clases de C++ y mantener estos datos en los objetos.

¿Ha sido útil esta solución?