c++ - una - variables estaticas c#
Variables globales estáticas y externas en C y C++. (2)
Cuando #include
un encabezado, es exactamente como si colocara el código en el propio archivo fuente. En ambos casos, la variable varGlobal
se define en la fuente, por lo que funcionará sin importar cómo se declare.
Además, como se señaló en los comentarios, las variables de C ++ en el alcance del archivo no son estáticas, aunque se asignarán al almacenamiento estático. Si la variable fuera un miembro de la clase, por ejemplo, tendría que ser accesible a otras unidades de compilación en el programa por defecto y los miembros que no son de la clase no son diferentes.
Hice 2 proyectos, el primero en C y el segundo en C ++, ambos funcionan con el mismo comportamiento.
Proyecto C:
header.h
int varGlobal=7;
C Principal
#include <stdio.h>
#include <stdlib.h>
#include "header.h"
void function(int i)
{
static int a=0;
a++;
int t=i;
i=varGlobal;
varGlobal=t;
printf("Call #%d:/ni=%d/nvarGlobal=%d/n/n",a,i,varGlobal,t);
}
int main() {
function(4);
function(6);
function(12);
return 0;
}
Proyecto C ++:
header.h
int varGlobal=7;
main.cpp
#include <iostream>
#include "header.h"
using namespace std;
void function(int i)
{
static int a=0;
int t=i;
a++;
i=varGlobal;
varGlobal=t;
cout<<"Call #"<<a<<":"<<endl<<"i="<<i<<endl<<"varGlobal="<<varGlobal<<endl<<endl;
}
int main() {
function(4);
function(6);
function(12);
return 0;
}
Leí que las variables globales son externas por defecto y en C y estáticas por defecto en C ++; Entonces, ¿por qué funciona el código C ++?
Me refiero a int varGlobal = 7; es igual que estático int varGlobal = 7; y si es estático, solo se puede utilizar en el archivo que se declaró, ¿verdad?
Las variables globales no son extern
ni static
por defecto en C y C ++. Cuando declara una variable como static
, la está restringiendo al archivo fuente actual. Si lo declara como extern
, está diciendo que la variable existe, pero se declara en otro lugar, y si no la tiene declarada en otro lugar (sin la palabra clave extern
) obtendrá un error de enlace (símbolo no encontrado).
Su código se interrumpirá cuando tenga más archivos de origen, incluido ese encabezado, en el tiempo de enlace tendrá múltiples referencias a varGlobal
. Si lo declara como static
, funcionará con múltiples fuentes (es decir, se compilará y vinculará), pero cada fuente tendrá su propia varGlobal
.
Lo que puedes hacer en C ++, que no puedes en C, es declarar la variable como const
en el encabezado, así:
const int varGlobal = 7;
E incluir en múltiples fuentes, sin romper las cosas en el momento del enlace. La idea es reemplazar el antiguo estilo C #define
por constantes.
Si necesita una variable global visible en varios orígenes y no const
, declararla como extern
en el encabezado y declararla nuevamente, esta vez sin el trabajo de teclas externo, en un archivo de origen:
Cabecera incluida por múltiples archivos:
extern int varGlobal;
En uno de tus archivos fuente:
int varGlobal = 7;