C++;两个不同项目中静态变量之间的链接是如何发生的 我是C++的新手,我有疑问这个问题是如何工作的, 标题.h

C++;两个不同项目中静态变量之间的链接是如何发生的 我是C++的新手,我有疑问这个问题是如何工作的, 标题.h,c++,linux,C++,Linux,lib.cpp-包含header.h文件并创建.so source.cpp-包含相同的头文件.h(和dynamicali links lib.so),链接时抛出.gnu.linkonce\t错误 因此,为了避免这种情况,我采用了这种方法 标题.h lib.cpp-包含header.h文件并创建.so source.cpp- int x::arr = {define some values} 包含相同的header.h文件,并且不会抛出链接错误,就像您不知道在header中声明静态变量时会发生什

lib.cpp-包含header.h文件并创建.so

source.cpp-包含相同的头文件.h(和dynamicali links lib.so),链接时抛出.gnu.linkonce\t错误

因此,为了避免这种情况,我采用了这种方法

标题.h lib.cpp-包含header.h文件并创建.so

source.cpp-

int x::arr = {define some values}

包含相同的header.h文件,并且不会抛出链接错误,就像您不知道在header中声明静态变量时会发生什么一样

阅读更多关于它的信息

在类中放置静态数组的解决方案很好,但在某些情况下可能会导致静态顺序初始化失败,因此在使用静态类成员变量时必须小心


如果您更喜欢第1种方式,可以声明类似数组的外部变量,并在源文件中定义它。

首先,您不应该在头文件中定义静态全局变量。在类外部定义静态变量与在类内部定义静态变量具有完全不同的含义。这是非常混乱的,但是C++是如何工作的。 在C++中,关键字static至少有四种用法:

1) 类之外的静态全局变量对于可以直接“查看”变量的代码来说是全局变量,因为它们位于同一个文件中。这使变量成为文件的局部变量。如上所述,您不应该将其中一个放在标题中。如果您这样做,您将得到同一变量的多个实例。包含标头的每个文件中都有一个。对其中一个文件的更改不会影响其他文件中的其他文件

2) 静态全局函数的含义与#1中的静态全局变量大致相同。一般来说,这意味着函数只能从声明它的文件中调用。与静态全局变量一样,如果在头文件中实现静态全局函数,则最终会在最终可执行文件中获得该函数的多个副本。但是,与静态全局变量不同,如果将静态全局函数定义放在头文件中,则链接生成的对象文件时会遇到问题

3) 类中的静态变量意味着对于该类的所有实例,该变量只有一个副本

4) 类中的静态成员函数只能访问该类中的静态变量。静态成员函数无法访问所有其他类数据。但是,可以在没有类实例的情况下调用静态成员函数。e、 g.
A::func()

您可能希望使用静态类变量或在头文件中放入
extern
定义,如下所示:

extern int arr[2][2];
int arr[2][2] = {some values};
然后在一个实现文件中,实际创建变量实例,作为一个非静态变量,如下所示:

extern int arr[2][2];
int arr[2][2] = {some values};

确保您理解声明/定义和实例化/实现之间的区别。这些是C/C++中的概念。

非常感谢。。。我也试着做了你提到的事。但不确定哪种方法更好,header1.h---extern int arr[2][2];并在source.cpp----int arr[2][2]={some values}@guru IMO中定义值,第二种方法更好,因为污染全局名称空间是一种不好的做法,使用全局变量也是一种不好的做法。非常感谢VJo。。。。。。当我做第一个时,静态数组有一个外部链接,编译器在将my.so obj文件与我的exe链接时发现一个问题。但是当我把我的arr移到课堂上时,需要一个外部链接,一切都正常。希望我的理解是正确的!!!