2010-08-07 5 views
2

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

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

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

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

ответ

12

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

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

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

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

+0

Ваш ответ вместе с wilx были именно то, что мне было нужно. Спасибо, сэр – Overseer10

1

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

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

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

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

7

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

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

В foo.h:

extern int * p; 

и в main.cpp:

int * p = something;