Registro de aprendizaje de C ++, estático, declaración y definición, variables globales y variables locales

  • La diferencia entre variables locales y variables globales
  1. Las variables locales se definen dentro de una función y no son accesibles fuera de la función. (Definido en un área limitada por {})
  2. Las variables globales se definen fuera de todas las funciones y se puede acceder a todas las funciones dentro de su alcance. Expliquemos en detalle a continuación.
  3. El tiempo de vida de una variable local está en el {} donde está definida Una variable global es cualquier variable definida en el programa excepto para todas las funciones (incluida la función principal).
  4. El alcance de las variables globales es la parte del programa desde la definición de la variable hasta el final de todo el programa. Esto significa que todas las funciones definidas después de las variables globales pueden acceder a las variables globales.
#include<iostream>
using namespace std;
void California (); // Function prototype

int BIRDS = 500; // Global constant
int main()
{
    
    
    cout <<  "In main there are " << BIRDS << " birds.\n";
    California();
    cout <<  "In main there are " << BIRDS << " birds.\n";
    return 0;
}

void California()
{
    
    
    const int BIRDS = 10000;
    cout << "In California there are " << BIRDS << " birds.\n";
}

输出:
In main there are 500 birds.
In California there are 10000 birds.
In main there are 500 birds.

De lo anterior, entendamos temporalmente las variables locales y las variables globales.

  • La diferencia entre declaración y definición en C ++

La sección 2.3.5 de la cuarta edición de "C ++ Primer" decía lo siguiente:

  1. Definición de variable: se utiliza para asignar espacio de almacenamiento para variables y también puede especificar valores iniciales para variables. En el programa, la variable tiene una y solo una definición. Pero puede haber varias declaraciones
  2. Declaración de variable: se utiliza para indicar el tipo y nombre de la variable al programa.
  3. Una definición también es una declaración: cuando definimos una variable declaramos su tipo y nombre.
  4. externPalabras clave: externdeclare nombres de variables utilizando palabras clave sin definirlas.
extern int i;// 是声明,不是定义,也即不分配空间。
int i;// 是声明,同时也定义,为其分配了空间。
任何包含了显式初始化的声明即成为定义。
我们能给由extern关键字标记的变量赋一个初始值,但是这么做也就抵消了extern的作用。extern语句如果包含初始值就不再是声明,而变成定义了:
extern int i = 10;//定义,extern作用被抵消

函数的声明和定义区分比较简单,带有{
    
    }的即为定义,没带{
    
    }即为声明。
int max(int a, int b); //函数的声明

Dé un ejemplo para ilustrar que solo hay una definición, pero puede haber múltiples declaraciones

#include<iostream>
using namespace std;
extern int a;//声明
int main(){
    
    
	int a = 10;//定义
	int a = 11;//此时,编译器会报错。
	a = 11;//此时,并不会报错,这不在是定义了,而是赋值。
	cout << a << endl;
	return 0;
}
  1. esconder. (La función estática y la variable estática son ambas)
    Al compilar varios archivos al mismo tiempo, todas las variables y funciones globales que no tienen el prefijo estático tienen visibilidad global.
    Dé un ejemplo para ilustrar. Compile dos archivos fuente al mismo tiempo, uno es ac y el otro es main.c.
//a.c
char a = 'A'; // global variable
void msg()
{
    
    
     printf("Hello\n");
}
 
//main.c
 
int main()
{
    
    
     extern char a; // extern variable must be declared before use
     printf("%c ", a);
     (void)msg();
     return 0;
}
输出:
Hello

¿Por qué pueden las variables globales ay funciones definidas en corriente alterna pueden utilizar en corriente alterna ? msgmain.c
Todas staticlas funciones y variables globales sin prefijo tienen visibilidad global y también se puede acceder a otros archivos de origen. En este ejemplo, aes una variable global, msguna función y no hay staticprefijo, por lo que es visible para el otro archivo fuente main.c.
Si se agrega static, se ocultará de otros archivos de origen. Por ejemplo , si se agrega antes de la definición de ay msg static, no se puede ver en ellas main.c. Utilice esta función para definir funciones y variables con el mismo nombre en diferentes archivos sin preocuparse por los conflictos de nombres. staticSe puede usar como prefijo para funciones y variables, para funciones, staticla función se limita a ocultar.

  1. staticLa segunda función es mantener la persistencia del contenido de la variable. ( staticFunción de memoria y vida útil global en variables)

Las variables almacenadas en el área de datos estáticos se inicializarán al comienzo del programa, que es la única inicialización. Hay dos tipos de variables almacenadas en el área de almacenamiento estático: variables globales y variables estáticas, pero en comparación con las variables globales, staticpuede controlar el rango visible de variables. Aunque este uso no es común
PS: si staticse define como una variable local en una función, su duración es el programa fuente completo, pero su alcance sigue siendo el mismo que el de una variable automática, y la variable solo se puede usar en la función que define la variable. Después de salir de la función, aunque la variable todavía existe, no se puede utilizar.

#include <stdio.h>
 
int fun(){
    
    
    static int count = 10; //在第一次进入这个函数的时候,变量a被初始化为10!并接着自减1,以后每次进入该函数,a
    return count--; //就不会被再次初始化了,仅进行自减1的操作;在static发明前,要达到同样的功能,则只能使用全局变量:    
 
}
 
int count = 1;
 
int main(void)
{
    
    
     printf("global\t\tlocal static\n");
     for(; count <= 10; ++count)
               printf("%d\t\t%d\n", count, fun());
     return 0;
}
输出:
global  local static
1 10
2 9
3 8
4 7
5 6
6 5
7 4
8 3
9 2
10 1

-En base a los dos puntos anteriores, se puede sacar una conclusión: cambiar una variable local a una variable estática cambia su modo de almacenamiento, es decir, cambia su vida útil. Cambiar una variable global a una variable estática cambia su alcance y limita su alcance de uso. Por lo tanto static, el papel de este especificador en diferentes lugares es diferente.

  1. staticEl tercer rol es inicializar a 0 por defecto ( staticvariable)

De hecho, las variables globales también tienen este atributo, porque las variables globales también se almacenan en el área de datos estáticos. En el área de datos estáticos, el valor predeterminado de todos los bytes en la memoria es · 0x00, esta característica puede reducir la carga de trabajo del programador en algunos casos. Por ejemplo, para inicializar una matriz dispersa, podemos poner todos los elementos uno por uno 0, y luego 0asignar valores a varios elementos que no lo son . Si se define como estático, se omite la 0operación de configuración inicial . Otro ejemplo es usar una matriz de caracteres como una cadena, pero creo que es ‘\0’demasiado problemático agregar al final de la matriz de caracteres cada vez . Si la cadena se define como estática, este problema se guardará, porque originalmente estaba allí ‘\0’; también podría hacer un pequeño experimento para verificarlo.

#include <stdio.h>
 
int a;
 
int main()
{
    
    
     int i;
     static char str[10];
     printf("integer: %d; string: (begin)%s(end)", a, str);
     return 0;
}
输出:
integer: 0; string: (begin) (end) 

Finalmente static, haga un resumen de una oración de las tres funciones. En primer lugar, la función principal de static es ocultar, y en segundo lugar, debido a que la staticvariable se almacena en el área de almacenamiento estático, tiene persistencia y valor predeterminado 0.

  1. static Papel en la clase

Continuará,
como referencia, aún no se ha visto, el papel de la estática en la clase
como referencia, aún no se ha visto, la diferencia entre estática y constante.

  • extern Resumen de funciones

En el lenguaje C, los modificadores se externutilizan antes de la declaración de una variable o función para indicar que "esta variable / función se define en otro lugar y debe citarse aquí". Al externdeclarar una variable global, primero debe dejar en claro: externel alcance es el proyecto completo, es decir, cuando lo escribimos en el archivo .h extern int a; al vincular, el vinculador irá a otros archivos .cpp para averiguar si hay es cualquier int aSi no es así, el enlace informará un error;

  1. externDeclaración de variable modificada

Si el archivo ac necesita hacer referencia a las variables en bc int v, se puede declarar en ac extern int vy luego se puede hacer referencia a las variables v.
Cabe señalar aquí que el vatributo de enlace de la variable referenciada debe ser externo, lo que significa que se debe hacer referencia a ac v, no solo depende de la declaración en ac extern int v, sino que también depende de que la vpropia variable pueda ser referenciada.
Esto involucra otro tema del lenguaje C: el alcance de las variables. externLas variables a las que pueden hacer referencia otros módulos con modificadores suelen ser variables globales.
Otro punto muy importante es que extern int vse puede ubicar en cualquier lugar de la CA, por ejemplo, puedes hacer una función CA al funcomienzo de la declaración en la definición extern int v, luego puedes hacer referencia a las variables v, y solo de esta manera solo la función funreferencial alcance vOlvídalo , esto sigue siendo una cuestión de alcance variable. Por esto, muchas personas tienen preocupaciones a la hora de usarlo. Parece externque la declaración solo se puede utilizar en el ámbito del archivo.

shengming.h

extern int a;
extern int b;

shengming.cpp //此处并不需要加 #include ”shengming.h"

int a = 10;
int b = 20;

main.cpp

#include <iostream>
#include "shengming.h"
using namespace std;
int main()
{
    
    
    cout << a << " " << b << endl;
    return 0;
}
输出: 10 20
  1. externDeclaración de función modificada

En esencia, no hay diferencia entre una variable y una función. El nombre de la función es un puntero al comienzo del bloque binario de la función.
Si necesita consultar el archivo ac bc en función, como en el prototipo bc int fun(int mu), puede declararse en ac extern int fun(int mu), entonces puede usarlo funpara hacer cualquier cosa.
Al igual que la declaración de una variable, se extern int fun(int mu)puede colocar en cualquier lugar de ac, no necesariamente en el ámbito del ámbito del archivo de ac.
Para referencias a funciones en otros módulos, el método más común es incluir los archivos de encabezado de estas declaraciones de función. Utilice externe incluya el archivo de encabezado para hacer referencia a qué diferencia funciona.
extern¡La forma de citar es mucho más concisa que incluir archivos de encabezado! externEl método de uso es sencillo: puede externdeclarar a qué función desea hacer referencia .
Una ventaja obvia de esto es que acelerará el proceso de compilación del programa (preprocesamiento, para ser precisos) y ahorrará tiempo. En el proceso de compilación de grandes programas en C, esta diferencia es muy obvia.

  1. externLos modificadores se pueden utilizar para indicar la especificación de llamada de funciones C o C ++

Por ejemplo, para llamar a las funciones de la biblioteca C en C ++, necesita programar en C ++ usando la extern “C”instrucción para hacer referencia a la función.

Esto es para el enlazador, que le dice al enlazador que use la especificación de la función C para enlazar al enlazar. La razón principal es que los programas C ++ y C tienen diferentes reglas de nomenclatura en el código de destino después de que se compilan.
Referencias: uso de extern para compilar C y C ++ mixto

  • La diferencia entre variables globales externas modificadas y estáticas

La palabra clave estática tiene muchas funciones, como declarar variables globales estáticas, variables locales estáticas y miembros estáticos de clases. La discusión principal aquí es la diferencia entre él y extern al modificar variables globales. Hay dos puntos a tener en cuenta:
1. Cuando static modifica variables globales, la declaración y la definición se dan al mismo tiempo,
2. El alcance global de static es solo su propia unidad de compilación. extern se refiere a todo el proyecto. Una unidad de compilación se refiere a un archivo .cpp y los archivos de encabezado que contiene. Es decir, cuando static modifica variables globales, el alcance de "global" es menor que extern. Por lo tanto, usar static para declarar (y definir) variables globales en el archivo de encabezado no tendrá el problema de las definiciones repetidas discutidas anteriormente.
Consulte la diferencia entre extern y static para modificar variables globales

Si extern quiere acceder a otros archivos modificados como variables estáticas, no está permitido. extern no es una definición, sino la introducción (declaración) de variables globales no estáticas definidas en otros archivos fuente;

Referencias no leídas

Supongo que te gusta

Origin blog.csdn.net/JACKSONMHLK/article/details/114236757
Recomendado
Clasificación