Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在c/c+;中,在源文件之间共享变量的最佳策略是什么+;?_C++_C_Global Variables_Extern - Fatal编程技术网

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

C++ 在c/c+;中,在源文件之间共享变量的最佳策略是什么+;?,c++,c,global-variables,extern,C++,C,Global Variables,Extern,我经常需要编写包含10多个源文件的c/c++程序,其中需要在所有文件中的函数之间共享一些变量。我以前读过,避免在extern中使用全局变量通常是一种很好的做法。然而,如果完全有必要使用全局变量,这就提供了一个很好的策略。最近,我一直在尝试将所有变量包装到一个结构或类中,并将这个结构传递给不同的函数。我想知道人们认为哪种方式更清洁,如果还有更好的选择。 编辑:我意识到两种语言的策略可能不同。我对只适用于一种语言或两种语言的策略感兴趣。我的C++语言 我发现在C++中使用名称空间来限制全局变量的范围

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

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

我的C++语言 我发现在
C++
中使用
名称空间来限制全局变量的范围是一种很好的做法。这样,您就可以消除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++
全局变量到处都是,这是一个坏代码的例子。
如果你想在全球范围内共享东西,那么把它们分组,并遵循单例模式

例如:

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中包含互斥/信号量机制,以便线程安全地访问其成员

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

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


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


总结一下

在这两种语言中,应尽量避免使用全局变量。

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

它真的需要全局变量吗? 这是您应该经常问的第一个问题,该变量是否在所有上下文中全局使用。答案几乎可以肯定不,不是

考虑上下文 变量是全局状态,还是上下文?全局状态通常是罕见的,另一方面,上下文是相当常见的。如果是全局状态,考虑在单体中进行包装,这样您就可以管理与全局的交互方式。使用<代码> Atomic 可能不是一个坏主意,你至少应该考虑同步。< /P> 如果它是上下文,那么它应该在结构或类中显式传递,因为数据显式地与该上下文相关,而不是其他上下文。显式地传递上下文似乎是一种负担,但它非常清楚上下文来自何处,而不仅仅是从以太引用随机变量

范围是什么?
说globals是有作用域的似乎有些奇怪,但是在单个文件中声明的任何global都可能被声明为
static
,因此无法与任何其他文件链接。这意味着您可以限制在给定范围内访问全局状态的用户。这可以防止人们随意调整变量。

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

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

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

它会迫使你考虑所有权、生命周期、依赖性和责任。你知道,成年人的事

然后,当您能够自如地编写全局免费代码时,您就可以开始违反所有这些规则了。

因为规则就是:遵循,也要被打破。

我会说这不是C/C++问题,而是C或C++问题。在这两种语言中,您的选项和最佳实践非常不同。为什么使用全局变量是一种不好的实践?在C++中,你可以说你应该使用对象方法,所以全局变量应该被属性替换,但是在C中,我没有看到问题。“我一直在玩弄把结构中的所有变量打包成一个结构或类的策略,并把这个结构传递给不同的函数。”这是避免globals的一个好方法。该死,我正要说同样的话:)一个坏代码的例子。特别是在多线程环境中。代码在非多线程环境中非常有效。但我同意单例设计模式要好得多。但是这些代码也是线程安全的,你有一个很好的观点,但是你必须小心它不是空的,或者它只创建了一次。不建议新手使用:)@losifM单身汉的全部要点是只创建一次。我知道,但你会惊讶地发现有这么多人出现在面试中,把单身汉模式搞得一团糟。@losif M.我同意;但是一旦你做对了,你就可以编写更好的代码了,“在C中”部分同样适用于两种语言。如果你真的,真的因为某种原因想要一个全局的,只使用一个单件。此外,请注意,此实现并不能解决与globals相关的所有生存期问题:保证在首次访问之前创建对象,但在销毁后可能仍被其他静态对象访问。
不同的模块希望同时为其使用不同的值
,除非您分别使用带有互斥体和信号量的单例来避免死锁和活锁。这与多线程无关。假设你有