Спецификаторы хранения extern,static,register,auto

257
22 января 2018, 08:30

В чём суть каждого из спецификаторов? И почему в данном коде я не могу получить доступ к переменной i ,так как по определению static хранит значение до конца программы в памяти. И еще как мне с помощью static посчитать сколько раз вызывалась функция?

Код:

#include "stdafx.h"
#include <iostream>
using namespace std;
int foo() 
{
    static int i = 0;
    i++;
    return i;
}
int main()
{
    foo();
    cout << i;
    system("pause");
    return 0;
}
Answer 1

В С++ уже давно нет спецификаторов хранения register и auto. Спецификаторы хранения в С++ сводятся к: static, thread_local, extern и mutable.

Прямой доступ к переменной в С++ делается через ее идентификатор - имя. Доступиться к переменной по ее "короткому" идентификатору можно только изнутри области видимости этого идентификатора. Также при помощи оператора :: можно доступаться к идентификаторам в других областях видимости. Однако оператор :: не позволяет доступаться к идентификаторам, объявленным локально. В вашем случае идентификатор i объявлен локально, т.е. виден только внутри функции foo, поэтому доступиться к i за пределами foo вы не сможете.

То, что "static хранит значение до конца программы" на видимость идентификатора i никак не вляет: время жизни объекта и область видимости его идентификатора - совершенно не зависящие друг от друга понятия.

"Как с помощью static посчитать сколько раз вызывалась функция" фактически прекрасно проиллюстрировано вашим же примером

int main()
{
    cout << foo() << endl;
    cout << foo() << endl;
    cout << foo() << endl;
    cout << foo() << endl;
}
READ ALSO
Constexpr локальные переменные

Constexpr локальные переменные

Пусть имеется такой код:

282
Оконное приложение на С++

Оконное приложение на С++

Выбивает ошибку:

286
Ошибка "Vector subscriptout of range&#39;&#39;

Ошибка "Vector subscriptout of range''

Начал недавно учиться программировать на c++ при выборе функции enter() во второй раз, моя программа выдаёт ошибку vector subscript out of range

261
Не удаётся скомпилировать код с файлом в качестве аргумента main (file.open(argv[1]))

Не удаётся скомпилировать код с файлом в качестве аргумента main (file.open(argv[1]))

В среде MVS2015 следующий код и вообще любой подобный:

246