Управление глобальной статической переменной - PullRequest
0 голосов
/ 20 января 2019

Предположим, у меня есть main.cpp, file.h и file.cpp.Где file.cpp реализует все прототипы в file.h, а main.cpp включает file.h.

Очень простая структура.Мне было интересно, если бы я объявил статическую глобальную переменную в main.cpp, было бы возможно получить доступ к такой переменной при реализации всех функций в file.cpp?С быстрой попыткой это не похоже на случай ... Я даже не могу скомпилировать его.

Но можно ли обойти это?

Просто чтобы уточнить, у меня есть

file.h:

#ifndef __FILE_H
#define __FILE_H
#include <iostream>

void my_func();

#endif

file.cpp

#include "file.h"

using namespace std;

void my_func() {
    //do something with my_static_var
}

и main.cpp

#include "file.h"

static int my_var = 0;

int main(int argc, char** argv) {
    my_func();
    return 0;
}

Предположим, классы не задействованы

Ответы [ 2 ]

0 голосов
/ 20 января 2019

Нет.static здесь буквально означает «не позволяйте мне делать» то, что вы пытаетесь сделать.Это делает объект приватным для этого модуля перевода, с внутренней связью .

Удалите static, и вы будете золотыми (используйте объявление extern в другом месте, чтобы перевести его в область видимости), хотя вы должны избегать глобальных.

0 голосов
/ 20 января 2019

На переменную с внутренней связью можно ссылаться только из областей ее единицы перевода (что обычно означает ее исходный файл). Переменная, объявленная с ключевым словом static, имеет внутреннюю связь.

На переменную с внешней связью можно ссылаться из других единиц перевода (из других исходных файлов). Переменная имеет внешнюю связь, если она не находится в анонимном пространстве имен и:

  • объявлено с ключевым словом extern или
  • это область видимости (например, my_var в вопросе) и объявляется без const и static (в отличие от my_var в вопросе).

Ссылка: срок хранения

...