在c/c++中,在源文件之间共享变量的最佳策略是什么



我经常不得不用10多个源文件编写c/c++程序,其中需要在所有文件中的函数之间共享少数变量。我以前读过,避免在extern中使用全局变量通常是一种很好的做法。然而,如果完全有必要使用全局变量,则此链接提供了一个很好的策略。最近,我一直在考虑将所有变量封装在一个结构或类中,并将该结构传递给不同的函数的策略。我想知道人们认为哪种方式更清洁,是否有更好的选择。

编辑:我意识到这两种语言的策略可能不同。我对只适用于一种语言或同时适用于两种语言的策略感兴趣。

传递一个"上下文"数据的类/结构,而不是全局变量。您会惊讶于全局变量不再是全局变量的频率,因为不同的模块希望同时为其使用不同的值。

全局变量的更好选择是不使用全局变量。

不要试图使用结构、名称空间、单例或其他愚蠢的东西来掩盖它们,这些东西的唯一目的是隐藏你正在使用全局变量的事实。

只是永远不要创造一个。曾经

它会迫使你思考所有权、生命、依赖性和责任。你知道,成年人的东西。

然后,当你能够自如地编写全局免费代码时,你就可以开始违反所有这些规则
因为这就是规则的作用:被遵守,也被打破。

它真的需要全局性吗

这是你应该经常问的第一个问题,这个变量是否全局使用,例如在所有上下文中。答案几乎可以肯定不,不是

考虑上下文

变量是全局状态,还是上下文?全局状态通常很少见,而上下文则很常见。如果是全局状态,请考虑封装在一个单例中,这样您就可以管理与全局的交互方式。使用Atomic<>可能不是一个坏主意,您至少应该考虑同步。

如果它是上下文,那么它应该在结构或类中显式传递,因为数据与该上下文显式相关,而不是其他上下文。显式传递上下文可能看起来像是一种负担,但它非常清楚上下文的来源,而不仅仅是引用以太中的随机变量。

范围是什么

全局变量是有作用域的,这可能看起来很奇怪,但在单个文件中声明的任何全局变量都可以声明为static,因此与任何其他文件都不可链接。这意味着您可以限制谁可以访问给定范围内的全局状态。这样可以防止人们随意调整变量。

我对C的理解++

无论如何,我发现在C++中用namespace来限制全局变量的范围是一种很好的做法。这样,您就可以消除10多个源文件之间的任何歧义。

例如:

namespace ObjectGlobalVars {
   //Put all of your global variables here
   int myvariable = 0;
}
//And then later on you can reference them like
ObjectGlobalVars::myvariable++;

在c++中
到处都是全局变量,这是坏代码的一个例子
如果你想在全球范围内共享东西,那么把它们分组并遵循singleton模式。

示例:

class Singleton
{
    private:
        int mData;
    public:
        static Singleton& getInstance()
        {
            static Singleton instance;
            return instance;
        }
        int GetData()
        {
            return mData;
        }
    private:
        Singleton() {};
        Singleton(Singleton const&);
        void operator=(Singleton const&);
};

优点:

  • 只有1个全局变量。我们的singleton的实例。

  • 您可以在singleton中包含互斥/信号量机制,以便对其成员进行线程安全访问。

  • 限制其成员的访问,帮助您避免逻辑同步缺陷

缺点:

  • 更难实施。-如果这是你第一次-



在c中
您应该避免声明全局变量,而是在结构中传递它们。

例如:

struct MyData
{
    int a;
    int b;
};
void bar(struct MyData* data)
{
    data->b = 2;
}
void foo()
{
    struct MyData mdata;
    mdata.a = 1;
    bar( &mdata );
}



总结
这两种语言中,应尽可能避免存在全局变量。

最新更新