2013-02-26 2 views
2

У меня есть ситуация, когда у меня есть пара заголовка/реализации (x.hpp/x.cpp). Где есть статическая переменная с глобальной областью, определенной в x.cpp.Обеспечение статической переменной с глобальным масштабом существует один раз везде

Заголовок x.hpp используется во многих разных местах в рассматриваемом приложении. и также предназначен для использования библиотек DLL, которые приложение будет использовать, либо автозагрузкой или через dlopen/LoadLibrary т.д.

--- x.hpp --- 
int foo(); 
void boo(); 

class fooboo 
{ public: void boofoo() {} }; 
------------- 

--- x.cpp --- 
static fooboo global_var; 
fooboo foo() { return global_var; } 
void boo() { global_var.boofoo(); } 
------------- 

.

Мой вопрос: В C++ есть средство, с помощью которого можно гарантирую при всех различных вариантов использования того, как TU (x.hpp/x.cpp) можно назвать и использовать, что только один экземпляр global_var существует ?.

Примите во внимание многопоточные и dll-ситуации. Помимо того, что каждый экземпляр в кодовой базе, который ссылается на global_var с extern, есть что-то еще, что можно сделать?

+0

Я не уверен в ситуации с dll, но ваш пример показывает одну скрытую глобальную переменную. Поскольку он доступен только через 'foo()' и 'boo()', эти функции должны реализовывать защиту потоков. –

+0

Все, что определяет «extern fooboo global_var»; также будет иметь доступ к глобальной переменной. – Switzy

+0

@Switzy Я не думаю, что это правильно; ключевое слово static указывает, что переменная не имеет внешней привязки и не будет видима/доступна в других объектных файлах/библиотеках. – Rollie

ответ

1

Как бы то ни было, переменная создается и видима только внутри блока перевода x.cpp; может быть только один, если x.cpp только когда-либо компилируется один раз. Включение его в файлы .dll и .exe приведет к 2 экземплярам переменной, но кроме того, что вы в безопасности. Обратите внимание, что foo() не возвращает ссылку на fooboo, он возвращает ее копию (и, кстати, также неверно совпадает с объявлением заголовка).