Понимание различий между глобальными статическими и глобальными нестатическими переменнымиC++.

Введение

Операционные системы и видеоигры — это лишь два примера из множества приложений, которые можно создать с помощью популярного языка программирования C++. Способность C++ определять и обрабатывать множество типов переменных является одной из его ключевых характеристик. Глобальные, статические, локальные и нестатические переменные могут быть определены в C++, и каждый тип имеет свой набор свойств и область действия.

В этой статье будут обсуждаться различия между этими типами переменных и их областями действия, а также то, как они влияют на работу программы на C++. Чтобы сделать различия более четкими, мы дадим экземпляры каждого вида переменных и сравним их результаты. Вы узнаете больше об областях видимости и типах переменных C++ после прочтения этой статьи.

Терминология:

В C++ переменные могут быть объявлены с разными областями действия и классами хранения, что определяет их видимость и время жизни в программе. Начнем с определений глобальных, статических, локальных и нестатических переменных из учебника в C++:

  1. Глобальные переменные: это переменные, которые определены вне какой-либо функции или класса. Глобальные переменные имеют глобальную область действия и видны во всей программе. Они создаются в начале программы и остаются в памяти до завершения программы. Доступ к глобальным переменным может получить любая функция или класс внутри программы.
  2. Статические переменные: это переменные, объявленные с помощью ключевого слова «static». Статические переменные имеют локальную область действия, но время их существования распространяется на всю программу. Когда статическая переменная объявляется внутри функции, она сохраняет свое значение между вызовами функции. Когда статическая переменная объявляется вне какой-либо функции или класса, она имеет глобальную область видимости и может быть доступна любой функции или классу в программном файле.
  3. Локальные переменные: это переменные, объявленные внутри функции или блока кода. Локальные переменные имеют локальную область видимости и видны только внутри функции или блока, где они объявлены. Они создаются при выполнении функции или блока и уничтожаются при выходе из функции или блока.
  4. Нестатические переменные: это переменные, которые не объявлены с помощью ключевого слова «static». Нестатические переменные имеют локальную область видимости и видны только внутри функции или блока, где они объявлены. Они создаются при выполнении функции или блока и уничтожаются при выходе из функции или блока. Нестатические переменные не сохраняют свое значение между вызовами функций.

Понимание разницы по коду:

Локальная статическая или локальная нестатическая переменная

#include <iostream>
using namespace std;

void function()
{
    int localNonStatic = 0;
    static int localStatic = 0;

    localNonStatic++;
    localStatic++;

    cout << "localNonStatic = " << localNonStatic << endl;
    cout << "localStatic = " << localStatic << endl;
    cout << "--------------"<< endl;
}

int main(){
    cout << "Call to function(): " << endl;
    function();
    function();
    function();
    function();

    return 0;
}
//filename:local3.cpp
>>g++ local3.cpp
>>./a.out
Calling the function 
localNonStatic = 1
localStatic = 1
--------------
localNonStatic = 1
localStatic = 2
--------------
localNonStatic = 1
localStatic = 3
--------------
localNonStatic = 1
localStatic = 4
--------------

Вывод этой программы показывает значения двух переменных, объявленных внутри функции: localNonStatic и localStatic.

localNonStatic — это нестатическая переменная, что означает, что она имеет локальную область видимости и создается каждый раз при вызове функции. В этой программе localNonStatic инициализируется 0 в начале каждого вызова функции, и его значение увеличивается на 1 каждый раз, когда функция выполняется. Таким образом, вывод показывает, что localNonStatic всегда равно 1, поскольку оно сбрасывается в 0 в начале каждого вызова функции.

localStatic, с другой стороны, является статической переменной, что означает, что она имеет локальную область действия, но время жизни распространяется на всю программу. localStatic инициализируется 0 только при первом вызове функции, и его значение увеличивается на 1 при каждом выполнении функции. Поскольку localStatic сохраняет свое значение между вызовами функции, выходные данные показывают, что его значение увеличивается на 1 каждый раз, когда функция выполняется. Таким образом, выходные данные показывают, что localStatic начинается с 1 и увеличивается на 1 при каждом вызове функции.

Таким образом, разница между localNonStatic и localStatic заключается в том, что localNonStatic сбрасывается до своего начального значения в начале каждого вызова функции, а localStatic сохраняет свое значение между вызовами функции.

Глобальная статическая и глобальная нестатическая переменная

Глобальная нестатическая переменная

// File: global1.cpp
#include <iostream>
using namespace std;

//static int global_var = 42; // static global variable
int global_var = 42;
// File: global2.cpp
#include <iostream>
using namespace std;

extern int global_var;
int main() {
  cout << "Global variable value from global2.cpp " << global_var << endl; // this will cause a linker error if static global
    return 0;
}
>>g++ global2.cpp global1.cpp
>>./a.out
Global variable value from global2.cpp 42

Глобальная статическая переменная

// File: global1.cpp
#include <iostream>
using namespace std;

static int global_var = 42; // static global variable
//int global_var = 42;
// File: global2.cpp
#include <iostream>
using namespace std;

extern int global_var;
int main() {
  cout << "Global variable value from global2.cpp " << global_var << endl; // this will cause a linker error if static global
    return 0;
}
>>g++ global2.cpp global1.cpp
/nix/store/039g378vc3pc3dvi9dzdlrd0i4q93qwf-binutils-2.39/bin/ld: /tmp/ccbhNoCM.o: in function `main':
global2.cpp:(.text.startup+0x20): undefined reference to `global_var'
collect2: error: ld returned 1 exit status

В первом случае global_var является нестатической глобальной переменной, что означает, что она доступна и может быть изменена всеми функциями во всех файлах, которые включают заголовок, в котором объявлена ​​переменная. В global1.cpp global_var определяется как 42, а в global2.cpp доступ к нему осуществляется с помощью extern int global_var, который объявляет, что переменная определена в другом файле. Когда два файла скомпилированы и связаны друг с другом с помощью g++ global2.cpp global1.cpp, компоновщик успешно связывает global_var, и программа выводит ожидаемое значение 42.

Во втором случае global_var является статической глобальной переменной, то есть она доступна и может быть изменена только в том файле, где она объявлена. В global1.cpp global_var определяется как 42, но с ключевым словом static. Когда global2.cpp пытается получить доступ к global_var с помощью extern int global_var, это приводит к ошибке компоновщика, поскольку переменная видна только внутри global1.cpp из-за ее статического класса хранения.

В двух словах…

В заключение, глобальные переменные имеют глобальную область действия и могут быть доступны из любого места в программе, в то время как локальные переменные имеют локальную область действия и могут быть доступны только внутри своего блока. Статические переменные сохраняют свое значение даже после окончания их области действия, а нестатические переменные создаются каждый раз при входе в их область действия. Выбор между этими типами переменных зависит от конкретных потребностей программы и желаемой функциональности. В конечном счете, понимание различий и правильное использование каждого типа переменных имеет решающее значение для эффективного программирования на C++.