why - C/C++ global vs estático global




why static functions are used in c (2)

Un nombre que esté estático en cada archivo no debe causar colisiones de nombres. Si está viendo eso, publique un código de demostración (abreviado) que lo muestre, junto con el compilador exacto que está utilizando para que podamos verificar correctamente el código y, suponiendo que sea correcto, vilipendiar correctamente el compilador.

Solo FWIW, el método preferido en C ++ es usar un espacio de nombre anónimo en su lugar:

namespace { 
    int not_a_static_variable;
}

Honestamente, no, no puedo apuntar a una gran ventaja objetiva, aunque ...

https://code.i-harness.com

Posible duplicado:
Estático vs global

Estoy confundido acerca de las diferencias entre las variables globales globales y estáticas. Si estático significa que esta variable es global solo para el mismo archivo, ¿por qué en dos archivos diferentes el mismo nombre causa colisiones de nombre?

¿Alguien puede explicar esto?


Las variables globales (no static ) están ahí cuando se crea el archivo .o disponible para el vinculador para su uso en otros archivos. Por lo tanto, si tiene dos archivos como este, obtiene colisión de nombre en a :

C.A:

#include <stdio.h>

int a;

int compute(void);

int main()
{
    a = 1;
    printf("%d %d\n", a, compute());
    return 0;
}

antes de Cristo:

int a;

int compute(void)
{
    a = 0;
    return a;
}

porque el enlazador no sabe cuál de los globales debe usar.

Sin embargo, cuando define variables globales estáticas, le está diciendo al compilador que mantenga la variable solo para ese archivo y no permita que el vinculador lo sepa. Entonces, si agrega static (en la definición de a ) a los dos códigos de muestra que escribí, no obtendrá colisiones de nombres simplemente porque el vinculador ni siquiera sabe que hay una a en ninguno de los archivos:

C.A:

#include <stdio.h>

static int a;

int compute(void);

int main()
{
    a = 1;
    printf("%d %d\n", a, compute());
    return 0;
}

antes de Cristo:

static int a;

int compute(void)
{
    a = 0;
    return a;
}

Esto significa que cada archivo funciona con uno propio sin conocer los demás.

Como nota al margen, está bien tener uno de ellos static y el otro no siempre y cuando estén en diferentes archivos. Si dos declaraciones están en el mismo archivo ( unidad de traducción de lectura), una static y una extern , vea esta respuesta .





global-variables