在C ++应用程序中使用全局变量

时间:2015-03-09 18:25:28

标签: c++ extern globals

我使用了全局变量而没有任何明显的问题,但想知道我使用全局变量是否存在潜在的问题或缺点。

在第一个场景中,我将const globals包含到globals.h文件中,然后我将头部包含在各种实现文件中,我需要访问任何一个全局变量:

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

在第二个场景中,我在应用程序执行时声明并初始化实现文件中的全局变量。这些全局变量永远不会被修改。当我需要从不同的实现文件访问这些全局变量时,我使用extern关键字:

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

关于上面的第一个场景,我考虑删除所有不同的“include globals.h”并使用extern来访问那些全局变量但是还没有这样做,因为只包含globals.h非常方便。

我担心每个包含globals.h的实现文件都会有不同版本的变量。

我应该使用extern而不是包含globals.h到处需要访问吗?

请告知,谢谢。

3 个答案:

答案 0 :(得分:3)

您的实施现在没问题。

时,全局变成了问题
  1. 你的程序在增长,你的全局数量也在增长。
  2. 新人加入了不知道你在想什么的团队。
  3. 当程序变为多线程时,数字1变得特别麻烦。然后你有许多线程使用相同的数据,你可能需要保护,这只是一个全局变量列表很难。 通过根据某些标准(如目的或主题)将数据分组到单独的文件中,随着代码的增长,代码变得更易于维护,并为项目中的新程序员留下面包屑,以确定软件的工作方式。

答案 1 :(得分:2)

全局可变变量

  • 在所有代码中提供不可见的影响力,
  • 你不能依赖他们的价值观,或者他们是否已经初始化。

也就是说,全局可变变量对于数据流来说是全局goto曾经为执行流做的事情,造成意大利面乱,浪费了每个人的时间。

常量全局变量更好,但即使是遇到的那些

也是如此
  • 初始化顺序fiasco。

我记得当我意识到在包装一个众所周知的GUI框架时遇到的所有麻烦是由于它不必要地使用全局变量并引发初始化顺序惨败而我有多生气。首先,愤怒是针对作者,然后是我自己是如此愚蠢,没有意识到发生了什么(或者更确切地说,没有继续)。反正。

所有这一切的合理解决方案是迈耶斯'单身,像

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

对于从知道值的某个地方动态初始化的全局的情况,“一个程序员的常量是另一个程序员的变量”,没有 good < / em>解决方案,但一个实际的解决方案是接受运行时错误的可能性并至少检测它:

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(); }

答案 2 :(得分:1)

全局变量的一个问题是,当您在代码中包含第三方库时,有时它们会使用与您的名称相同的全局变量。绝对有时候全局有意义,但如果可能的话,你也应该注意做一些事情,比如将它放入命名空间。