如何在C++中使用公共静态变量 < StCupp.t/P>中的多个文件中,没有一个明确的、简洁的实例来说明C++中的公共静态变量的实际使用。 P.>有很多例子说明如何在单个C++翻译单元中使用静态变量,以及许多关于静态关键字的各种用法的精确性质的问题,但是作为一个对C有更丰富经验的程序员,我发现很难把我需要的东西拼凑起来,简单地在一个类上有一个静态变量,然后像在C或Java中一样在其他地方使用它

如何在C++中使用公共静态变量 < StCupp.t/P>中的多个文件中,没有一个明确的、简洁的实例来说明C++中的公共静态变量的实际使用。 P.>有很多例子说明如何在单个C++翻译单元中使用静态变量,以及许多关于静态关键字的各种用法的精确性质的问题,但是作为一个对C有更丰富经验的程序员,我发现很难把我需要的东西拼凑起来,简单地在一个类上有一个静态变量,然后像在C或Java中一样在其他地方使用它,c++,static,C++,Static,在这里,我将尝试以最直接的方式展示我的发现。我希望其他人随后会改进答案,并为感兴趣的人提供更多的技术细节 某个班级 在我们想要有一个静态变量的类的头文件中,我们只是像在C或Java中一样声明它是静态的。不要尝试在此处初始化变量;C++不喜欢这样。 上课 { 公众: 静态bool some_标志; }; SomeClass.cpp 在类的cpp文件中,我们为静态变量创建存储,就像为成员函数提供实现一样。在这里,我们可以初始化变量。到目前为止,进展顺利 包括一些类 bool SomeClass::s

在这里,我将尝试以最直接的方式展示我的发现。我希望其他人随后会改进答案,并为感兴趣的人提供更多的技术细节

某个班级

在我们想要有一个静态变量的类的头文件中,我们只是像在C或Java中一样声明它是静态的。不要尝试在此处初始化变量;C++不喜欢这样。 上课 { 公众: 静态bool some_标志; }; SomeClass.cpp

在类的cpp文件中,我们为静态变量创建存储,就像为成员函数提供实现一样。在这里,我们可以初始化变量。到目前为止,进展顺利

包括一些类 bool SomeClass::some_flag=true; SomeOtherClass.cpp

这就是我遇到问题的地方。如果我们试图从别处访问SomeClass::some_标志,我们必须承认,这可能是您首先需要公共静态变量的原因,链接器会抱怨它不知道它所在的位置。我们已经告诉编译器静态变量存在,所以编译器很高兴。问题是,在另一个转换单元中,我们从未指定静态变量的存储位置。您可能会尝试重新声明存储,并希望链接器将它们都解析为我在SomeClass.h中声明的some_标志,但不会。它会抱怨你给了变量两个家,这当然不是你的意思

我们需要做的是告诉链接器,某些_标志的存储位于其他位置,并且一旦我们尝试在链接时将所有翻译单元放在一起,就会找到它。我们使用extern关键字进行此操作

包括其他类别 包括一些类 外部布尔SomeClass::some_标志; void SomeOtherClass::SomeOtherFunction { SomeClass::some_flag=true; }; 瞧!编译器很高兴,链接器很高兴,希望程序员也很高兴

我现在把这个问题留给大家讨论,讨论我不应该使用一个公共变量,应该通过87层代码传递一个SomeClass的实例,在它和使用之间,应该使用C++23中的一些特性,应该使用boost::Obsclething等等


但是,我欢迎任何与我在这里演示的用法相同的解决这个基本问题的替代方法。

对于那些只需要代码就可以回去工作的人,以摘要形式给出答案:

某个班级

布拉格语一次 上课 { 公众: 静态bool some_标志; }; SomeClass.cpp

包括一些类 bool SomeClass::some_flag=true; SomeOtherClass.cpp

包括其他类别 包括一些类 外部布尔SomeClass::some_标志; void SomeOtherClass::SomeOtherFunction { SomeClass::some_flag=true; } 这就是我遇到问题的地方。如果我们试图从别处访问SomeClass::some_标志[…],链接器会抱怨它不知道自己住在哪里

只要您与定义变量SomeClass.cpp的翻译单元链接,链接器就不会抱怨

这种声明既不允许,也没有必要。包含变量声明的类定义对于编译器足够,SomeClass.cpp中的变量定义对于链接器足够

不要尝试在此处初始化变量;C++不喜欢这样。 然而,我欢迎对这一根本问题采取任何替代办法

您可以简单地使用一个内联变量,因为C++17:

class SomeClass
{
public:
    inline static bool some_flag = true;

从这里开始的那一段是我遇到问题的地方。这是无稽之谈,如果你得到一个链接器错误,那么你有一些其他的错误,这是不明显的,从你张贴。使用extern的建议是错误的。顺便说一句,您可以使用静态的,因为C++14,而不是有单独的声明和定义。您应该使用静态成员函数来实现这种全局标志,尤其是不能使代码保持多线程安全。此外,Linux上的静态类全局函数和共享库不能很好地配合使用。@M.M从C++17开始,当然了?@M.M你是说它将在不声明外部函数的情况下编译吗?因为它不适合我,但在类定义后加一个分号,没有外部布尔行,在倒数第二行加一个冒号。这将是一个好主意
您实际编译的st代码感谢您的更正,我当时正匆忙地从一个大得多的文件中复制代码。在C++11中我该如何执行此操作?@DrefSkren查看链接的演示
class SomeClass
{
public:
    inline static bool some_flag = true;