2015-03-09 3 views
0

Я использовал глобальные переменные без каких-либо заметных проблем, но хотел бы знать, есть ли потенциальные проблемы или недостатки при использовании глобальных переменных.Использование глобальных переменных в приложении C++

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

globals.h 
const int MAX_URL_LEN = 100; 
const int MAX_EMAIL_LEN = 50; 
… 

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

main.cpp 
char application_path[128]; 
char data_path[128]; 
// assign data to globals 
strcpy(application_path, get_dll_path().c_str()); 
… 

do_something.cpp 
extern char application _path[]; // global is now accessible in do_something.cpp 

Что касается первого сценария выше, я рассмотрел удаление все различные «включает globals.h» и использование EXTERN где нужен доступ к этим глобальным переменным, но не сделал этого, так как просто включение globals.h настолько удобно.

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

Должен ли я использовать extern вместо того, чтобы включать globals.h везде нужен доступ?

Просьба сообщить, и спасибо.

+1

совет: минусы tants прекрасны, но не используют глобальные переменные. При необходимости передавайте данные или объекты. – crashmstr

+0

Вы можете взглянуть на это относительно глобальных переменных в целом: http://stackoverflow.com/questions/484635/are-global-variables-bad – NathanOliver

+0

Вы можете поместить 'extern something;' в заголовок, а затем включите заголовок, который должен писать вручную. Кроме того, вы не должны использовать имена, начинающиеся с '_' в глобальном пространстве имен (поскольку стандарт говорит об этом). – HolyBlackCat

ответ

2

Глобальные изменяемые переменные

  • обеспечивают невидимые линии влияния через весь код, и
  • вы не можете полагаться на свои ценности, или когда-ли они были инициализированы.

То есть, глобальные изменяемые переменные сделать для потока данных, что глобальный goto когда-то для потока исполнения, создавая беспорядок спагетти, тратить время на каждого.

Постоянные глобальные переменные являются более хорошо, но даже для тех, кто вы бежите в

  • порядок инициализации фиаско.

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

Разумное решение всех это одноэлементные Мейерс, как

inline 
auto pi_decimal_digits() 
    -> const string& 
{ 
    static const string the_value = compute_pi_digits(); 
    return the_value; 
} 

Для случая глобального, которая динамически инициализирована с некоторого местом, которое знает значение, “ один программист постоянного является еще одним программиста переменной ”, нет хорошего решения, но один практическое решения принять возможность ошибки времени выполнения и, по крайней мере обнаружить:

namespace detail { 
    inline 
    auto mutable_pi_digits() 
     -> string& 
    { 
     static string the_value; 
     return the_value; 
    } 
} // namespace detail 

inline 
void set_pi_digits(const string& value) 
{ 
    string& digits = detail::mutable_pi_digits(); 
    assert(digits.length() == 0); 
    digits = value; 
} 

inline 
auto pi_digits() 
    -> const string& 
{ return detail::mutable_pi_digits(); } 
+0

Что вы подразумеваете под «глобальной« goto »? Что такое «глобальное»? –

+0

@LightnessRacesinOrbit: C и C++ отсутствуют глобальные 'goto', если вы не считаете' longjmp'. –

+0

Да, я знаю; поэтому я спросил вас, почему вы упомянули гипотетический «глобальный« goto »в ответе на C++. –

3

Ваша реализация на данный момент прекрасна. Глобалы становятся проблемой, когда

  1. Ваша программа растет, а также количество ваших глобальных комбинаций.
  2. Новые люди присоединяются к команде, которая не знает, о чем вы думали.

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

+0

Re «Ваша реализация на данный момент прекрасна», абсолютно нет. Выявление логических констант как изменчивых глобальных переменных очень непросто. –

+0

Alf: Ваша точка хорошо взята, но иногда быстро и грязно идеально подходит для того, что вы пытаетесь выполнить, особенно если вы не знаете ничего лучше. – Bruce

+0

@LightnessRacesinOrbit: Я никогда не отвечаю на комментарии. – Bruce

1

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

Смежные вопросы