Глобальная проблема статического указателя - PullRequest
2 голосов
/ 07 августа 2010

Это скорее проблема из запутанной ситуации. У меня есть статический указатель в одном из моих заголовочных файлов. Который включается повсюду, поэтому я поставил его как статический указатель. Чтобы я мог быстро инициализировать его в своей основной функции, чтобы другие файлы могли его использовать.

Проблема в том, что даже после того, как я инициализирую его и помещаю в него что-нибудь. Другие файлы только найти его NULL. Это похоже на то, что каждый файл, содержащий заголовок со статическим указателем, делает его копию для себя, и даже когда другие инициализируют его, каждый файл имеет свою собственную отдельную копию. Отрицание конечно, цель иметь глобальную переменную.

Как я могу справиться с этим ?. Может быть, я неправильно понимаю статическую переменную, или, может быть, это потому, что это указатель?

Должен ли я объявить его как: & variable = 5; или просто как переменная = 5; или & variable = (int) 5?

Ответы [ 3 ]

12 голосов
/ 07 августа 2010

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

Вот что означает static применительно к переменной в области имен: переменной присваивается внутренняя связь, что делает ее "локальной" для заданной единицы перевода (исходного файла).

Если у вас есть переменная static в области имен в заголовочном файле, и вы включаете этот заголовочный файл в несколько файлов .cpp, будет несколько экземпляров этой переменной: по одному для каждого из файлов .cpp, которые включают заголовочный файл.

Если вам нужна глобальная переменная, которая используется несколькими исходными файлами, вам нужно сделать ее extern. Объявите переменную как extern в заголовочном файле, затем определите переменную extern точно в одном из ваших файлов .cpp.

7 голосов
/ 07 августа 2010

Да, вы неправильно поняли ключевое слово static. Ключевое слово Static в пространстве имен и в области видимости файла объявляет переменную, которая видна только внутри модуля перевода (в основном один файл .cpp плюс все его включения), где она объявлена. Объявляя статическую переменную в заголовке, которую вы используете в нескольких файлах .cpp, вы фактически определяете несколько переменных.

Если вам нужен глобальный указатель, объявите его extern без static в одном заголовке и определите его без extern или static в одном файле .cpp. E.g.:

В foo.h:

extern int * p;

и в main.cpp:

int * p = something;
1 голос
/ 07 августа 2010

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

Вы должны объявить его extern в заголовке и определить один раз в одном файле cpp.

Я могу представить, что путаница возникла из-за того, что ключевое слово static работает внутри определения class или struct. Действительно, он работает там по-другому и создает одну переменную, общую для всех экземпляров class или struct.

Btw. Если вы действительно хотите, чтобы переменная была видимой только в одной единице перевода, рекомендуется поместить ii в анонимное пространство имен. static тоже работает, но его использование не рекомендуется как устаревшее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...